C语言函数库中的strlen函数表明,传入一个char类型的指针,返回一个size_t类型(unsigned int)的返回值,并且此函数只能用于字符串不能用于数组,下面我们就用三种方法来模拟实现一下strlen函数。
1.计数器方法
事先解释一下assert函数是为了防止变量str为空,用此函数需声明assert.h文件。
模拟C语言函数库来定义一个my_strlencou函数(名字随便起),并在函数内定义一个无符号类型的变量count,再次利用while循环来找字符串中的‘\0'字符(此字符是创建字符串时自动添加的),如果不是\0'字符,count就加1,如果找到\0'字符就跳出循环并返回count。while (*str++) count++;这句换就是while(*str){count++; str++}
//计数器方法
size_t my_strlencou(const char* str)
{
assert(str);
size_t count = 0;
while (*str++) count++;
return count;
}
2.指针-指针
以为字符串时char*类型的,char在内存中占一个字符,在定义字符串时char[],也可以理解为定义一个char类型的数组,并在数组最后方多放一个’\0'字符,这样我们就可以用循环来找到‘\0'在内存中的位置,因为在找寻'\0'字符时地址值会发生变化,所以我们就要多定义一个字符地址sopystr来拷贝原str地址,再用新创建的copystr经行差找'\0',最后再用’\0'的地址减去原str的地址再减一(这里减一是减去‘\0'的地址,返回时不算'\0')就可以了。
//指针-指针
size_t my_strlenpoin(const char* str)
{
assert(str);
char* copystr = str;
while (*copystr++);
return copystr - str - 1;
}
3.递归的方法
我们先拿到一个字符地址,之后就返回数字1和本函数的调用 ,盗用的函数实参就是str加一,(str加一就是字符串中下一个字符的地址值),再给函数写一个停止调用的功能,我们让此函数在str地址值指向’\0'时我们就停止调用本函数,并返回一个数字0(因为'\0'不算长度),这样我们的函数就完成了。
//递归的方式
size_t my_strlenrecu(const char* str)
{
if (*str == '\0')
return 0;
else
return my_strlenrecu(++str) + 1;
}
4.创建函数内计算的方法
此方法算是拓展,因为此方法只能在定义字符串变量的方法内使用,如果定义的字符串被传值到其他的方法内,再使用此方法就不行了。
方法就是简单的计算用C语言中自带的sizeof函数先算出字符串的总大小,再用sizeof算出字串中任意一个字符的大小,再相除减一(减一减的是‘\0’字符所占总字符的大小,取字符串内任意字符:我们可以把字符串看成一个字符数组,就是再数组组后放加一个‘\0’,所以用字符数组中arr[0],在字符串中也能用。
int main()
{
char arr[] = "adffgg" ;
int len = sizeof(arr) / sizeof(arr[0]) - 1;
printf("%d", len);
}