【C语言】字符串函数
目录
前言
一、求字符串长度的函数
1.1 ❥ strlen
二、长度不受限制的字符串函数
2.1 ❥ strcpy
2.1.1 strcpy的模拟实现
2.2 ❥ strcat
2.2.1 strcat的模拟实现
2.2.2 字符串自己追加自己问题
2.3 ❥ strcmp
2.3.1 strcmp的模拟实现
三、长度受限制的字符串函数
3.1 ❥ strncpy
3.2 ❥ strncat
3.3 ❥ strncmp
四、字符串查找
4.1 ❥ strstr
4.1.1 strstr的模拟实现
4.2 ❥ strtok
五、错误信息报告
5.1 ❥ strerror
5.2 ❥ perror
前言
本节重点介绍处理字符串的库函数的使用和注意事项。
一、求字符串长度的函数
1.1 ❥ strlen
函数原型如下:
size_t strlen ( const char * str );
strlen函数:求字符串长度的函数
size_t: unsigned int 即无符号整型
注意事项
- 字符串是以'
- strlen的使用需要包含头文件:#include '作为结束的标志,strlen返回的是字符串'
- 参数指向的字符串必须以'
- strcmp的使用需要包含头文件:#include '结尾'之前出现的字符个数(不包括'
- 比较的是字符的ASCII值。
2.3.1 strcmp的模拟实现
的ASCII最小。 ')
三、长度受限制的字符串函数
我们看下面代码:
输出">"的原因:因为strlen的返回值是一个size_t类型的,也就是无符号的整形。
可以强制转换成int,这样就会输出""); } else if (ret == 0) { printf("="); } return 0; }
运行结果如下图所示:
说明比较的是该字符的ASCII值。
返回值是int的原因是:
第一个字符串0
注意事项
3.1 ❥ strncpy
补充如下图:
#include #include int main() { char arr1[] = "abcdefg"; char arr2[] = "hello world"; strncpy(arr1, arr2, 5); printf("%s", arr1); return 0; }
#include #include #include int my_strcmp(const char* str1, const char* str2) { int ret = 0; assert(str1 != NULL); assert(str2 != NULL); while (*str1 == *str2) { if (*str1 == '\0') { return 0; } str1++; str2++; } return *str1 - *str2; } int main() { char arr1[]= "abcdef"; char arr2[] = "abcdg"; int ret = my_strcmp(arr1, arr2); if (ret3.2 ❥ strncat
char * strncpy ( char * destination, const char * source, size_t num );
strncpy函数:字符串拷贝受限制的函数。
拷贝num个字符从源字符串到目标空间。
代码如下:
#include #include int main() { char arr1[20] = "hello "; char arr2[] = "summer"; strncat(arr1, arr2, 5); printf("%s", arr1); return 0; }运行结果下图所示:
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后面追加\0,直到num个。
代码如下图所示:
运行结果如下图所示:
注意'\0'的作用
代码如下:
运行结构如下图所示:
#include #include int main() { char arr1[20] = "hello "; char arr2[] = "hh"; strncat(arr1, arr2, 5); printf("%s", arr1); return 0; }#include #include int main() { char arr1[20] = "helloxxxxxxxx"; char arr2[] = "world"; strncat(arr1, arr2, 5); printf("%s", arr1); return 0; }3.3 ❥ strncmp
#include #include int main() { char arr1[] = "abcdef"; char arr2[] = "abcq"; int ret = strncmp(arr1, arr2,4); printf("%d\n", ret); if (ret > 0) { printf(">"); } else if (retchar * strncat ( char * destination, const char * source, size_t num );
strncat函数:长度受限制的字符串追加函数
将source指向的字符串的前num个字符追加到destination指向的字符串末尾,再追加一个'\0'字符。
代码如下:
运行结果如下图所示:
调试结果如下图所示:
注意:arr1后要给定数组的大小,不给定就会由于初始化了6个,追加空间不够而报错。
如果source指向的字符串的长度小于num的时候,只会将字符串中到\0的内容追加到destination指向的字符串末尾。
代码如下所示:
soucre字符串是否给自己追加'\0'?我们来测试一下,代码如下:
因为\0是字符串结束的标志,此处追加5个字符,world在56789的位置,如果追加上一个\0,那么[10]的位置就是\0
从上图可看出,确实source自己给自己追加了 \0
int strncmp ( const char * str1, const char * str2, size_t num );
strncmp函数:比较两个字符串内容是否相等(长度受限制)
比较str1和str2的前num个字符,如果相等就继续往后比较,最多比较num个字母,如果提前发现不一样,就提前结束。大的字符所在的字符串大于另外一个。如果num个字符都相等,就返回0。
代码如下: