string.h头文件中十一个重要的函数,笔记已经上传至gitee
笔记指路:函数
不仅仅有本文的函数,还持续更新其他函数类型的解释
文章目录
- string.h头文件中十一个重要的函数,笔记已经上传至gitee
- 一、strcat 字符串追加
- 1. strncat
- 二、strstr 字符串查找
- 三、strlen 求字符串长度
- 四、strcpy 字符串拷贝
- 1. strncpy
- 五、strcmp 字符串比较
- 1. strncmp
- 六、strtok 字符串划分
- 七、memcpy 内存拷贝
- 八、memmove 内存移动
- 九、memcmp 内存比较
- 十、memset 内存重置
- 十一、strerror 错误信息
一、strcat 字符串追加
char * strcat ( char* strDestination, const char* strSource);
长度不受限制的字符串函数(与长度无关,不够安全)
返回类型:char * (目标空间的起始地址,dest)
参数类型:char * 、 const char*
前者是所要加添到目标数组,后者是需要加添的字符串(数组)
用途:在字符数组后面追加,黏贴另外一个数组
条件:
追加的时候保证目标空间足够大
追加的内容里必须有’\0’
char arr1[10] = "abs"; char arr2[] = "sd"; strcat(arr1, arr2);
1. strncat
char *strncat( char *strDest, const char *strSource, size_t count );
返回值:Each of these functions returns a pointer to the destination string.
这些函数都返回一个指向目标字符串的指针
字符串给自己添加自己的字符的时候
长度受限制的字符串函数
char arr[6] = "abc"; strncat(arr, arr, 2);//arr 变成 abcab char arr1[10] = "abs"; char arr2[] = "shd"; strncat(arr1, arr2, 6);//这里就算超过了追加数组的范围也只会加添到 //'\0'停止追加,与strncpy不同
二、strstr 字符串查找
查找字符串
char arr1[] = "ashwncecd"; char arr2[] = "hwn"; char* p = strstr(arr1, arr2);//在arr1中,找arr2字符串
如果找到了,返回第一次出现相同字符,对应字符的地址(在查找的字符串里的字符)
如果没有找到,则返回空指针,如果查找的字符串是空字符串(只有’\0’),则返回被查找字符串的起始地址
三、strlen 求字符串长度
形参类型:const char* string
返回类型:size_t 无符号整型 – unsigned int
求字符串长度,遇到’\0’则停止
char arr[] = "abcdef";
int sz = strlen(arr);
易错点:
char arr1[] = "abc"; char arr2[] = "abcde"; if(strlen(arr1) - strlen(arr2) < 0) { printf("1"); } else { printf("0"); }
分析:这里的strlen(arr1) - strlen(arr2)
因为计算机在处理不同类型数相加减时,哪个能表示更大的数就转为哪个类型,这里只有unsigned int类型,最大值为2^32-1,所以往unsigned int 转,所以结果为一个无符号整型是整数
四、strcpy 字符串拷贝
字符串拷贝
长度不受限制的字符串函数(与长度无关,不够安全)
将一个字符串拷贝到另外一个字符串中
char* strcpy ( char * strDestination, const char* strSource );
char arr1[20] = "abc";
char arr2[] = "abdws";
strcpy(arr1, arr2);
//将arr2的内容拷贝到arr1中,记得判断arr1的大小是否>=arr2
只拷贝到第一个’\0’截止
拷贝的内容必须有’\0’,不然会非法越界访问
目标空间需要足够大
目标空间必须可以改变(前没有const)
1. strncpy
长度受限制的字符串函数
char *strncpy( char *strDest, const char *strSource, size_t count );
返回值:Each of these functions returns strDest (返回目标数组首元素地址)
char arr1[20] = "abcdef"; char arr2[] = "xshw"; strncpy(arr1, arr2, 4);//将4个字符拷贝进去 strncpy(arr1, arr2, 7);//遇到'\0'停止,剩下3个字符由'\0'代替
五、strcmp 字符串比较
比较两个字符串内容大小,而不是长度
长度不受限制的字符串函数(与长度无关,不够安全)
参数:int strcmp( const char *string1, const char *string2 );
返回值:
Value Relationship of string1 to string2 < 0 string1 less than string2 0 string1 identical to string2 > 0 string1 greater than string2 注意:
返回负数或者正数不一定是 - 1 或者 1
比较到其中一个字符串遇到’\0’,或两个字符不相等时停止
实例:
char arr1[] = "abcd"; char arr2[] = "abd"; int ret = strcmp(arr1, arr2);
比较到c和d两个元素,c比d小,所以arr1相对而言比较小
返回负数
1. strncmp
长度受限制的字符串函数
int strncmp( const char *string1, const char *string2, size_t count );
指定比较到几个字符
返回值:
Return Value Description < 0 string1 substring less than string2 substring 0 string1 substring identical to string2 substring > 0 string1 substring greater than string2 substring
六、strtok 字符串划分
char *strtok( char *strToken, const char *strDelimit );
被划分的字符串, 用作划分的符号的集合
返回值:All of these functions return a pointer to the next token found in strToken.
返回标记元素的首元素地址,如果标记查找完,返回空指针
被划分的字符串中需要包含,分割符号
strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存这个标记之后的字符在字符串中的位置
strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记,之后做相同动作
ps:该函数有记忆功能,其中可能有静态变量
char arr[] = "rinne@163.com"; char arr1[20] = {0};//临时数据,备份,防止之前的被修改了 char del[] = "@."; strcpy(arr1, arr); strtok(arr1, del);//第一个参数不为NULL //将@改成'\0',并且返回r的地址 //这里 rinne 163 com 均为标记 //此时strtok函数记住了1的地址 strtok(NULL, del); //此时strtok,从1开始寻找,下一个标记,是163 //将163后的.改为'\0',返回1的地址 //此时strtok函数又记住了c的地址
常规操作:
char arr1[] = "rinne@csdn.com"; char arr2[20] = {0};//临时数据 char del[] = "@."; strcpy(arr2, arr1); char* ret = NULL;//记住标记的首元素地址,以打印 for(ret = strtok(arr2, del); ret != NULL; ret = strtok(NULL, del)) { printf("%s\n", ret); }
七、memcpy 内存拷贝
内存拷贝
void *memcpy( void *dest, const void *src, size_t count );
目标地址,需要拷贝的地址,需要拷贝数据的大小
返回类型:dest的首元素地址
int arr1[] = {1, 2, 3, 4, 5};
int arr2[10] = {0};
memcpy(arr2, arr1, 5 * sizeof(arr1));
//打印出来 arr2 是 1 2 3 4 5 0 0 0 0 0
memcpy 拷贝自己
拷贝重叠的部分时候,可能会出现错误
但在vs不会出现这种情况
八、memmove 内存移动
在遇到拷贝重叠部分时候使用
理解上可以认为,memmove包含了memcpy
void *memmove( void *dest, const void *src, size_t count );
返回类型:dest的首元素地址
int arr[] = {1, 2, 3, 4, 5}; memcpy(arr + 1, arr, 12);//拷贝 1 2 3 到 2 3 4
九、memcmp 内存比较
内存比较,比较数组中元素的大小
int memcmp( const void *buf1, const void *buf2, size_t count );
这里的count是字节
返回值:
Return Value Relationship of First count Bytes of buf1 and buf2 < 0 buf1 less than buf2 0 buf1 identical to buf2 > 0 buf1 greater than buf2
int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = {1, 2, 3};
memcmp(arr1, arr2, 4);//看arr2前2个元素arr1有没有
memcmp(arr1, arr2, 20);
//如果字节超过了数组大小,会报警告,且打印出-1
十、memset 内存重置
数组更改每个字节为所需要的数
void *memset( void *dest, int c, size_t count );
需要更改成的数字,更改的字节数
返回值:返回数组首元素地址
int arr[] = {1, 2, 3, 4, 5}; memset(arr, 1, 20);//前20个字节全变为1 memset(arr, 0, 20);//前20个字节全变为0
十一、strerror 错误信息
打印错误码对应的错误信息
char *strerror( int errnum );
返回值:错误信息所对应字符串地址
char *p = strerror(1); printf("%s\n", p);
解释:c语言调用失败的时候,会把错误码存在errno这个变量里面,是c语言内置的变量
以一个例子:
int main()
{
FILE* pf = fopen("test.txt", "r");
//打开文件函数,r是读取的意思
//errno - 存储错误码的变量
//strerror - 可以返回C语言内置的错误码对应的错误信息
if (pf == NULL)
{
//printf("%s\n", strerror(errno));
//打印 No such file or directory
perror("测试");//打印+strerror,直接打印错误
//会在自定义的信息后加上:和空格再加上错误信息
//打印 测试: No such file or directory
}
else
{
printf("打开文件成功\n");
}
return 0;
}