在我们使用C语言进行程序编写时,经常要对字符和字符串进行处理,所以为了在编程中能够更加方便的操作,我们应当学会C语言标准库中提供的一系列库函数,在熟练掌握后能够大大提高编程的效率。常见的函数包括 strlen, strcpy, strcat, strcmp, strncpy, strncat, strncmp, strstr, strtok, strerror。
如何快速理解字符函数
在我看来要彻底熟练的掌握一个函数,最重要的是要理解函数,深入理解函数的操作原理是什么,最好能够以自己的方式写代码模拟实现该函数,以达到一样的效果,这样就能够快速的掌握字符函数并且能熟练运用。
strlen函数
strlen函数是计算在字符串中 ‘ \0 ' 出现之前的字符个数(不包括 ' \0 ' ), 返回类型是一个无符号类型的值,因为字符串中字符的个数不可能为负数。在写代码时可以如下使用:
- 在使用 strlen 函数时要包含头文件 string.h
- 此代码是用 VS2022 编写,返回类型为 size_t 即为无符号类型,打印也要用 %zd 。
- 当字符串中出现 ’\0‘ 时就会结束。
接下来我们就用自己的方式对 strlen 函数进行模拟实现:
实现的办法有三种分别为计数器法、指针-指针、递归,下面我们逐个分析。
计数法
此方法是最为简单且更容易理解的方法,只需要使用循环和非常简单的指针便可以实现。
size_t my_strlen(char* p)
{
size_t count = 0;
assert(p);
while (*p)
{
count++;
p++;
}
return count;
}
当指针向后走到 \0 时 while 循环就会停下,此时 count 计数就是字符个数,上述代码中 assert 的作用主要是断言 p 是否是空指针,如果为空指针则条件为假程序就不会运行。
指针运算
指针相减得到的是两指针之间的元素个数,str 指针用于记录字符起始位置,循环使 p 指针找到结尾 \0 的位置。最后返回两指针相减的结果即是想要的结果。
int my_strlen(char* p)
{
char* str = p;
while (*p)
{
p++;
}
return p - str;
}
对于返回类型为 int 、size_t 二者对模拟实现没有太大影响,要准确一点用 size_t 更加合适。
递归
递归是C语言中比较重要的一种编程技巧,它允许函数调用自身来解决问题。
int my_strlen(char* p)
{
if (*p=='\0')
return 0;
else
return 1 + my_strlen(p + 1);
}
strcpy
后续便不再一一叙述,只要能达到与原函数相同的作用就行。
char* my_strcpy(char* dest, char* sor)
{
char* str = dest;
assert(dest && sor);
while (*dest++ = *sor++)
{
;
}
return str;
}
strcat
char* my_strcat(char* dest, char* sor)
{
char* ret = dest;
assert(dest && sor);
while (*dest)
{
dest++;
}
while (*dest++ = *sor++)
{
;
}
return ret;
}
strcmp
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return *str1 - *str2;
}
strncpy
char* my_strncpy(char* dest, const char* sor, size_t num)
{
char* ret = dest;
assert(dest && sor);
while (num)
{
*dest = *sor;
dest++;
sor++;
num--;
}
return ret;
}
strncat
char* my_strncat(char* dest, const char* sor, size_t num)
{
char* ret = dest;
assert(dest && sor);
while (*dest)
dest++;
while (num)
{
*dest = *sor;
dest++;
sor++;
num--;
}
return ret;
}
总结
strcpy、strncpy 非常相似只有一个字母的差别,由上也可以看到其他函数,都比没加 n 之前多了一个 num 的变量,我们称这个为长度受限的字符函数,strcpy 称为长度不受限的字符函数。因为多了一个变量的限制,在使用的时候也比不受限的较为安全一点,所以在往后的编程过程中尽量使用受限函数。