常用的字符串库函数
Strtok函数:
//strtok库函数
//strtok函数是C语言自带的库函数
//strtok函数是用于获取分割符号前的字符串函数
//如:abc@de.f
//第一次调用我们时,我们可以将目标数组里的元素临时拷贝到
//另一个数组里进行操作,第一次传参为(目标数组,数组里的符号)
//当碰到第一个符号时将该符号改为'\0',则返回符号前字符串首元素地址
//当第二次调用时,我们只需将目标数组变为空指针即可,
//开始寻找下一个符号前的字符串
//当再次调用函数时,往后找不到符号时返回NULL
#include<string.h>
int main()
{
char arr1[] = "abc@de.f";
char buf[30] = { 0 };
strcpy(buf, arr1);
char* p = "@.";
char *str = strtok(buf, p);
printf("%s\n", str);
str = strtok(NULL, p);
printf("%s\n", str);
str = strtok(NULL, p);
printf("%s\n", str);
return 0;
}
Strerror函数
//Strerror函数
//Strerror函数是C语言自带的库函数
//用于处理字符串的错误信息
//其构造为:char* strerror(int errnum)
//C语言的库函数在调用失败的时候,会将一个错误码存放在一个
//叫:errno的变量中,当我们想知道调用库函数的时候发生了什么错误信息
//,就可以将:errno中的错误码翻译成错误信息
//调用该函数会返回错误信息的首元素地址
#include<errno.h>//使用该库函数需包含此头文件
int main()
{
//使用指针来接受返回的首元素地址
//char*p = strerror(0);
//printf("%s\n", p);
//p = strerror(1);
//printf("%s\n", p);
//p = strerror(2);
//printf("%s\n", p);
//p = strerror(3);
//printf("%s\n", p);
//下面举个例子
//打开文件
// 如果文件打开方式是"r"
// 文件存在打开成功,文件不存在打开失败
//打开文件失败会返回空指针
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
printf("打开文件失败,原因是:%s\n", strerror(errno));
return 1;
}
//读写文件
//......
//关闭文件
fclose(pf);
return 0;
}
![](https://img-blog.csdnimg.cn/img_convert/fdfdb32d4c4c60d37f6c587fb877b40c.png)
![](https://img-blog.csdnimg.cn/img_convert/344e417b86923008614da5fb06b91163.png)
我们并没有这个文件,因此用strerror库函数返回错误信息,根据错误信息
让我们知道失败原因
字符分类函数
![](https://img-blog.csdnimg.cn/img_convert/e959ad40ab986c85ed2744780ed041e5.png)
Strlen函数
//Strlen函数
//用于求字符串元素个数
//计算'\0'之前的元素个数
//其构造为:int strlen(const char*要求的字符串首元素地址)
//使用该函数需包含string.h头文件
//注意:返回一个无符号整型
#include<stdio.h>
#include<string.h>
int main()
{
char p[] = "abcdef";
size_t ret = strlen(p);
printf("%d\n", ret);
return 0;
}
![](https://img-blog.csdnimg.cn/img_convert/3f59f660d6f1db639ca9d7486a039b64.png)
Strcpy函数
//Strcpy函数
//用于拷贝字符串到另一空间内(连带'\0')
//其构造为:char* strcpy(char* 目标空间,const char* 源头)
//最终会返回目标空间的首元素地址
// 注意:目标空间必须比源头空间大
//包含string.h头文件
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[20] = "abcdefg";
char* p = strcpy(arr2, arr1);
printf("%s\n", p);
return 0;
}
![](https://img-blog.csdnimg.cn/img_convert/8d1a80f9b94c366f9a6a024080410f50.png)
Strcmp函数
//Strcmp函数
//用于两个字符串之间的比较
//当字符串1>字符串2时,将返回>0的数字
//当字符串1<字符串2时,将返回<0的数字
//当字符串1=字符串2时,将返回=0的数字
//其构造为:int strcmp(const char*字符串1首元素地址,const char*字符串2首元素地址)
// 内部原理为:从第一个元素依次比较,当发现有>或<的情况时则返回,当全部元素相等时才返回0
//需包含string.h头文件
#include<stdio.h>
#include<string.h>
int main()
{
char p1[] = "abcdef";
char p2[] = "abcdel";
int ret = strcmp(p1, p2);
printf("%d\n", ret);
return 0;
}
![](https://img-blog.csdnimg.cn/img_convert/0b6caf9b51bc04fcc981b77cf31ae1a3.png)
Strcat函数
//Strcat函数
//用于字符串的接续,当我们想将字符串1连接到字符串2的后面时,我们可使用该函数实现
//其构造:char* strcat(char* 目标字符串,const char* 接续字符串)
//原理:将接续字符串包括'\0'连接到目标字符串'\0'的位置依次往后
//最终返回目标字符串的首元素地址
//使用需包含string.h头文件
//注意:目标字符串的空间需要足够大,能够存放接续字符串所以元素
#include<stdio.h>
#include<string.h>
int main()
{
char p1[] = "abcdef";
char p2[20] = "abcdef";
char* p = strcat(p2, p1);
printf("%s\n", p);
return 0;
}
![](https://img-blog.csdnimg.cn/img_convert/1e8b13fdfdd5f476e81f13234d238756.png)
Strncpy函数
//Strncpy函数
//用于指定几个字符拷贝到另一空间内
//其构造为:char* strcpy(char* 目标空间,const char* 源头,size_t num(数量))
//最终会返回目标空间的首元素地址
// 注意: 1.目标空间必须比源头空间大
// 2.如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
//包含string.h头文件
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "cdef";
char arr2[20] = "abcdef";
char* p = strncpy(arr2, arr1,2);
printf("%s\n", arr2);
return 0;
}
![](https://img-blog.csdnimg.cn/img_convert/30dc67c943b70513723c9397ed68f589.png)
Strncmp函数
//Strncmp函数
//用于指定几个字符进行的比较
//当字符串1>字符串2时,将返回>0的数字
//当字符串1<字符串2时,将返回<0的数字
//当字符串1=字符串2时,将返回=0的数字
//其构造为:int strcmp(const char*字符串1首元素地址,const char*字符串2首元素地址,size_t num(数字))
// 内部原理为:从第一个元素依次比较,当发现有>或<的情况时则返回,当全部元素相等时才返回0
//需包含string.h头文件
#include<stdio.h>
#include<string.h>
int main()
{
char p1[] = "abcdgf";
char p2[] = "abcdel";
int ret = strncmp(p1, p2,5);
printf("%d\n", ret);
return 0;
}
![](https://img-blog.csdnimg.cn/img_convert/33c4ba3ebc25c15acab7ec3329425608.png)
Strcat函数
//Strncat函数
//用于指定数量字符串的追加,当我们想指定num个字符连接到字符串2的后面时,我们可使用该函数实现
//其构造:char* strcat(char* 目标字符串,const char* 追加字符串,size_t num(数量))
// 无论追加几个字符,最后都会自动补'\0'
//最终返回目标字符串的首元素地址
//使用需包含string.h头文件
//注意:目标字符串的空间需要足够大,能够存放接续字符串所以元素
#include<stdio.h>
#include<string.h>
int main()
{
char p1[] = "abcdef";
char p2[20] = "abcdef";
char* p = strncat(p2, p1,3);
printf("%s\n", p);
return 0;
}
![](https://img-blog.csdnimg.cn/img_convert/311da0078a804df6341ad1bfa8f85265.png)
Strstr函数
//Strstr函数
//用于寻找字符串元素中第一次出现的字符串
//其构成为:char* strstr(const char* 总字符串,const char* 想寻找的字符串)
//最终返回第一次出现该字符串的首元素地址
//需包含string.h头文件
#include<stdio.h>
#include<string.h>
int main()
{
char p[] = "abcdefgh";
char e[] = "efgh";
char* k = strstr(p, e);
printf("%s\n", k);
return 0;
}
![](https://img-blog.csdnimg.cn/img_convert/4ad80ed37e487814e9d92f9449696128.png)
mem系列库函数
memcpy函数
//memcpy函数
//用于任意类型元素拷贝
//其构造为:void* memcpy(void* 目标空间,const void* 源头,size_t num(字节个数))
//注意:1.该函数并不是以遇到'\0'为停止标志
// 2.如果目标空间和源头有任何的重叠,复制的结果都是未定义的。
//需包含string.h头文件
#include<stdio.h>
#include<string.h>
int main()
{
int arr[] = { 1,2,3,4,5 };
int arr1[10] = { 5,4,3,2,1 };
int* p = memcpy(arr1, arr, 20);
int i = 0;
for (i = 0; i < sizeof(arr1)/sizeof(arr1[0]); i++)
{
printf("%d ", *(p + i));
}
return 0;
}
![](https://img-blog.csdnimg.cn/img_convert/3db4a0eddb10a3efbdfebc3c270327d8.png)
memmove函数
//memmove函数
// 与memcpy功能相似
// 区别在于:memmove可以拷贝位置重叠的情况
// 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
// (列如我们想拷贝源头字符串的情况)
//用于任意类型元素拷贝
//其构造为:void* memcpy(void* 目标空间,const void* 源头,size_t num(字节个数))
//memmove>memcpy,memmove包含了memcpy
//需包含string.h头文件
#include<stdio.h>
#include<string.h>
int main()
{
int arr[10] = { 1,2,3,4,5 };
int* p = memmove(arr+2, arr, 8);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
![](https://img-blog.csdnimg.cn/img_convert/58bf9e26acb59bceb521d73ecefcb76e.png)
memcmp函数
//memcmp函数
//用于任意类型元素比较
//其构造为:int memcmp(const void* 比较1,const void* 比较2,size_t sz(比较的字节个数))
//>返回>0的数
//<返回<0的数
//=返回=0的数
//包含string.h头文件
#include<stdio.h>
#include<string.h>
int main()
{
int p1[] = { 1,3,5,7,9 };
int p2[] = { 2,4,6,8,10 };
int ret = memcmp(p1, p2, 12);
printf("%d\n", ret);
return 0;
}
![](https://img-blog.csdnimg.cn/img_convert/23e449086f375632529a2ebac6b7e8e7.png)
memset函数
//memset函数
//用于修改指定字节个数元素的值
//其构造为:void* memset(void* 目标,修改内容,size_t num(字节个数))
//注意:该函数是根据字节个数来进行修改的
// 会有特殊情况:看一下代码
#include<stdio.h>
#include<string.h>
int main()
{
char p[] = "hello world!";
char* k = memset(p, 'p', 4);
printf("%s\n", k);
return 0;
}
![](https://img-blog.csdnimg.cn/img_convert/8d89b0b6577906f8a21ce126849256e8.png)
使用该函数做不到将p数组里的值全改为1,因为该函数修改方式是按照字节执行的
![](https://img-blog.csdnimg.cn/img_convert/aebd898ec9ce91a034ec2306806f8c05.png)