上篇文章介绍了一些常用的字符串函数,大家可以跳转过去浏览一下:c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(上))_总之就是非常唔姆的博客-CSDN博客
今天接着来介绍一些:
目录
一.字符串查找
1.strstr()
strstr
是一个C标准库函数,用于在一个字符串中查找另一个字符串的第一次出现的位置。它的原型如下:
char *strstr(const char *haystack, const char *needle);
strstr
函数接受两个参数,haystack
是要搜索的字符串,needle
是要查找的子字符串。函数返回一个指向第一次出现的子字符串的指针,如果找不到子字符串,则返回NULL
下面是strstr
函数的工作原理:
-
首先,
strstr
函数会在haystack
字符串中搜索needle
字符串的第一个字符 -
一旦找到了与
needle
的第一个字符匹配的字符,strstr
函数会继续比较haystack
中的后续字符和needle
中的字符,直到找到一个不匹配的字符或者needle
中的所有字符都匹配 -
如果找到了完全匹配的子字符串,
strstr
函数会返回指向该子字符串的指针 -
如果在
haystack
中找不到子字符串,或者needle
是一个空字符串,则strstr
函数会返回NULL
1.1示例
int main()
{
char arr1[] = "abcdef";
char arr2[] = "cd";
printf("%s", strstr(arr1, arr2));
return 0;
}
如果找到了完全匹配的子字符串,strstr
函数会返回指向该子字符串的指针,结果如下:
1.2注意事项:
1.3模拟实现
char* my_strstr(const char* a1, const char* a2)
{
char* cp = a1;
char* str1 = a1;
char* str2;
while (*cp)
{
str1 = cp;
str2 = a2;
while (*str1&&*str2&&*str1 == *str2)
{
str1++;
str2++;
}
if (*str2 == '\0')
{
return cp;
}
cp++;
}
return NULL;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "cd";
printf("%s", my_strstr(arr1, arr2));
return 0;
}
2.strtok()
strtok
是一个C标准库函数,用于将一个字符串分割成多个子字符串。它的原型如下:
其中,str
是要分割的字符串,delim
是用作分隔符的字符串。函数返回一个指向分割后的第一个子字符串的指针,如果没有更多的子字符串,则返回NULL
。
strtok
函数使用一个静态变量来保存当前的分割位置,因此在多次调用strtok
时,需要将原始字符串传递给第一次调用,而后续的调用只需要传递NULL
作为第一个参数
2.1示例
int main()
{
char arr[] = "123@abc%ABC";
char a[] = "@%";
printf("%s\n", strtok(arr, a));
/*printf("%s\n", strtok(NULL, a));*/
return 0;
}
结果如下:
int main()
{
char arr[] = "123@abc%ABC";
char a[] = "@%";
printf("%s\n", strtok(arr, a));
printf("%s\n", strtok(NULL, a));
printf("%s\n", strtok(NULL, a));
return 0;
}
结果如下:
2.2注意事项
二.错误信息报告
1.strerror()
strerror
是一个C标准库函数,用于将错误码转换为对应的错误信息字符串。它的原型如下:
其中,errnum
是错误码。函数返回一个指向错误信息字符串的指针
1.1示例
输出1~10分别代表的错误信息:
int main()
{
for (int i = 1; i <= 10; i++)
{
printf("%s\n", strerror(i));
}
return 0;
}
结果如下:
1.2注意事项:
三.内存操作函数
1.memcpy()
memcpy
是一个标准C库函数,用于将一段内存区域的数据复制到另一段内存区域。它的函数原型如下:
其中,dest
是目标内存区域的指针,src
是源内存区域的指针,n
是要复制的字节数。
memcpy
函数将源内存区域的前n
个字节复制到目标内存区域中。如果源和目标区域重叠,memcpy
函数的行为是未定义的。如果需要处理重叠区域的复制,可以使用memmove
函数(下面介绍)
1.1示例
int main()
{
char src[] = "Hello, world!";
char dest[20];
memcpy(dest, src, strlen(src) + 1);
printf("source string: %s\n", src);
printf("copied string: %s\n", dest);
return 0;
}
结果如下:
1.2注意事项
2.memmove()
memmove
是一个标准C库函数,用于将一段内存区域的数据复制到另一段内存区域,与memcpy
函数类似。但是,memmove
函数可以处理源和目标区域重叠的情况,而memcpy
函数则不能
memmove
函数的函数原型如下:
其中,dest
是目标内存区域的指针,src
是源内存区域的指针,n
是要复制的字节数。
memmove
函数将源内存区域的前n
个字节复制到目标内存区域中。如果源和目标区域重叠,memmove
函数会确保复制的结果是正确的,即使源和目标区域重叠。因此,memmove
函数比memcpy
函数更安全,但通常也更慢
2.1示例
int main()
{
char str[] = "123456";
memmove(str,str+3,3);
printf("%s\n", str);
return 0;
}
结果如下:
2.2注意事项:
3.memset()
memset
是一个用于设置内存块内容的函数。它可以将指定的内存块中的每个字节都设置为特定的值。
memset
函数的原型如下:
参数说明:
ptr
:指向要设置的内存块的指针。value
:要设置的值,以整数形式提供。num
:要设置的字节数。
memset
函数将ptr
指向的内存块的前num
个字节设置为value
指定的值
3.1示例
int main()
{
char str[20] = { 0 };
memset(str, 'A', 10);
printf("%s\n", str);
return 0;
}
结果如下:
3.2注意事项:
4.memcmp()
memcmp
函数用于比较两个内存区域的内容是否相同,其原型如下:
参数说明:
ptr1
:指向第一个内存区域的指针。ptr2
:指向第二个内存区域的指针。num
:要比较的字节数。
memcmp
函数将ptr1
指向的内存区域和ptr2
指向的内存区域的前num
个字节进行比较,返回值如下:
- 如果两个内存区域相同,返回0。
- 如果第一个内存区域小于第二个内存区域,返回负整数。
- 如果第一个内存区域大于第二个内存区域,返回正整数
4.1示例
int main()
{
char str1[20] = "Hello, world!";
char str2[20] = "Hello, world!";
int result1 = memcmp(str1, str2, strlen(str1));
printf("result = %d\n", result1);
return 0;
}
结果如下:
4.2注意事项:
好了各位,这次的内容就先整理到这里吧!下次按照学习计划就打了结构体的部分知识内容啦!