字符串函数
- 一.strlen(求字符串长度)
- 1.函数使用
- 2.模拟实现(三种方法)
- 二.strstr(字符串查找子串)
- 1.函数使用
- 2.模拟实现
- 三.strtok(字符串分割)
- 四.strerror,perror(打印错误信息)
一.strlen(求字符串长度)
1.函数使用
size_t strlen(const char* str);
- strlen函数用于求字符串的长度,参数是字符串的首地址,返回值是无符号的整形,初始化字符串有两种,它们各自存在一些小的细节,如下:
#include #include int main() { char str1[] = "abcdef";//本质:{ 'a','b','c','d','e','f','\0' };隐藏了\0在末尾 char str2[] = { 'a','b','c','d','e','f' }; //函数strlen(): 求字符串长度 printf("%zu\n", strlen(str1));//6 printf("%zu\n", strlen(str2));//由于尾部没有'\0'随机数,所以打印随机数 printf("%s\n", str2);//直到找到'\0'为止,停止打印 //关键字sizeof():求字节的大小返回值同样是size_t(unsigned int) printf("%zu\n", sizeof(str1));//7 printf("%zu\n", sizeof(str2));//6 return 0; }
- 可以看到str2的长度居然是33,其实这是因为strlen函数会从首地址指向的字符一直向后查找,直到遇到’\0’,才会停下(不包含 ‘\0’ ),统计’\0’之前出现的字符的个数,而str2末尾没有’\0’,所以会一直向后查找,在某个位置恰好遇到了’\0’,所以打印随机数33。
- printf函数打印字符串也是同样的道理,看似传入"abcdef",其实真正传入的是首地址(a的地址),遇到了’\0’,停止打印。那为什么会出现烫烫烫呢?这就牵扯到了函数栈帧了,日后会将函数栈帧更新上来。
总结:
-
字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前⾯出现的字符个数(不包
含 ‘\0’ )。
-
参数指向的字符串必须要以 ‘\0’ 结束。
-
注意函数的返回值为size_t,是无符号整形(size_t 等价于 unsigned int)。
易错点:
#include int main() { if (strlen("abc") - strlen("abcdef")) printf(">\n"); else printf("
-
- strlen函数用于求字符串的长度,参数是字符串的首地址,返回值是无符号的整形,初始化字符串有两种,它们各自存在一些小的细节,如下: