本文重点
函数作用 | 函数名 |
求字符串长度 | strlen |
长度不受限制的字符串函数 | strcpy strcat strcmp |
长度受限制的字符串函数 | strncpy strncat strncmp |
字符串查找 | strstr strtok |
错误信息报告 | strerror |
内存操作函数 | memcpy memmove memset memcmp |
字符操作 |
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。
字符串常量适用于那些对它不做修改的字符串函数。
1. strlen函数
功能: 获取字符串长度
size_t strlen ( const char * str );//返回字符串str的长度 //str--字符串
字符串的长度由终止空字符 '\0' 确定:字符串的长度与字符串开头和终止空字符之间的字符数一样长(不包括终止空字符本身)。
🍤 例如:
char str[100]="string ";
定义了一个大小为 100 个字符的字符数组,但初始化 str 时使用的字符串的长度仅为 7 个字符。因此,当 sizeof(str) 的计算结果为 100 时,strlen(str) 返回 7。
通过 strlen函数 比较两个字符串大小
//有符号 #include<stdio.h> #include<string.h> int main() { const char* str1 = "abcdef"; const char* str2 = "bbb"; if ((int)strlen(str2) -(int) strlen(str1) > 0) { printf("str2>str1\n"); } else { printf("srt1>str2\n"); } return 0; }
🍤 打印结果:
//无符号的 #include<stdio.h> #include<string.h> int main() { const char* str1 = "abcdef"; const char* str2 = "bbb"; if (strlen(str2) - strlen(str1) > 0) { printf("str2>str1\n"); } else { printf("srt1>str2\n"); } return 0; }
🍤 打印结果:
因为函数返回值是无符号的
注:
🍥 字符串str以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
🍥 参数指向的字符串必须要以 ‘\0’ 结束。
如果没有 ‘\0’ 结尾,长度会一直计算下去,直到遇到 ‘\0’ 。
🍥 注意函数的返回值为size_t,是无符号的。
1.1 模拟实现
#include<stdio.h> size_t my_strlen(const char* str) { int count = 0; while (*str != '\0')//终止条件 { count++;//累计 计算字符串长度 str++; } return count; } int main() { size_t sz = my_strlen("abc");//无符号类型 printf("%u\n", sz);//打印无符号十进制整型 return 0; }
2. strcpy函数
功能: 复制字符串
char * strcpy ( char * destination, const char * source ); //destination(目的地)--指向要在其中复制内容的目标数组的指针 //source(源)--要复制的字符串
将源指向的字符串复制到目标指向的数组中,包括终止的 ‘\0’ 字符(并在该点停止)。
为避免溢出,目标指向的数组的大小应足够长,以包含与源相同的字符串(包括终止空字符),并且不应在内存中与源重叠。
🍤 实例1:
#include <stdio.h> #include<string.h> int main() { char str1[] = "Sample string"; char str2[40]; char str3[40]; strcpy(str2, str1);//将str1拷贝到str2 strcpy(str3, "copy successful"); printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3); return 0; }
🍤 运行结果:
🍤 实例2:
#include <stdio.h> #include<string.h> int main() { char arr1[] = "xxxxxxxxxx"; char arr2[5] = { 'a', 'b', 'c', 'd', 'e' }; strcpy(arr1, arr2);//将 arr2 里的东西拷贝到 arr1 中 printf("%s\n", arr1); return 0; }
🍤 运行结果:
为什么结果不是 abcde 呢?
我们在调试时,打开监视窗口观察arr1的变化,虽然 abced 已拷贝给 arr1, 但没有发现结束标志,所以在创建 arr2 时,要在最后加上 ‘\0’
添加了结束标志的 arr2 :
注:
🍥 源字符串必须以 ‘\0’ 结束。
🍥 会将源字符串中的 ‘\0’ 拷贝到目标空间。
🍥 目标空间必须足够大,以确保能存放源字符串。
🍥 目标空间必须可变。
2.1 模拟实现
#include<stdio.h> #include<assert.h> char* my_strcpy(char* dest, const char* src) { char* ret = dest; assert(dest != NULL);//若字符串为空,就停止运行,并提示 assert(src != NULL); while (*src != '\0') { *dest = *src;//实现拷贝 dest++;//后移一个字符 src++; } *dest = *src;// '\0' return ret; } int main() { char arr1[20] = "hello world"; char arr2[] = "xxxxx"; my_strcpy(arr1 + 6, arr2);//从arr1的第六个字符之后开始拷贝arr2 printf("%s\n", arr1); return 0; }
🍤 运行结果:
🍩补充:
assert(表达式)--表达式为真时, 程序继续运行, 如果表达式为假, 那程序就会停止运行, 并提示错误信息