strlen的使用场景:求取字符串的\0之前的个数
求取字符串长度:
strlen的返回参数为size_t,这是一个无符号整形;如果想使用strlen的返回参数做减法运算,请注意,不要让结果为负数。为负数会是一个很大的数字;
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
size_t a = strlen("abc");
size_t b = strlen("abcdef");
size_t c = a - b;
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char arr[] = {'a','b','c','d'};
printf("%d", strlen(arr));
return 0;
}
可以看到,arr数组只有abcd四个字符,但是strlen输出的结果却是42;
这里就需要提及到strlen的原理是,通过判断字符串内 \0 (结束符)之前的字符个数;如过没有这个 \0 ,strlen就会在内存中一直向后访问,直到遇见 \0;才会结束
my_strlen的实现:
了解了函数的原理,实现起来就一目了然了;
第一种:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
assert(str != NULL); //判断str指针是否为空指针,预警报错
int count = 0; //字符个数
while (*str++ != '\0') //*(解引用)str 不等于 ‘\0’ 我就字符个数加一; 之后str指针加一
{
count++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
printf("%d",my_strlen(arr));
return 0;
}
第二种:递归方法
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
assert(str != NULL);
if (*str != '\0')
{
return 1+my_strlen(++str);
}
else
{
return 0;
}
}
int main()
{
char arr[] = "abcdef";
printf("%d",my_strlen(arr));
return 0;
}
第三种:指针减指针
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
assert(str!=NULL);
char* start = str;
while (*start != '\0') //start 得到字符串最后的位置
{
start++;
}
return start - str; //末尾位置,减去开头位置,剩下的就是字符个数
}
int main()
{
char arr[] = "abcdef";
printf("%d",my_strlen(arr));
return 0;
}