函数strstr
函数strchr与strrchr
- 注意:
-
- 这两个函数的功能,都是在指定的字符串 s 中,试图找到字符 c。
- strchr() 从左往右找第一个,strrchr() 从左往右找最后一个。
- 字符串结束标记 ‘\0’ 被认为是字符串的一部分。
函数strlen
- 示例:
char *s = "helloworld"; printf("helloworld的长度是:%d\n", strlen(s));
函数strcat与strncat
- 注意:
-
- 这两个函数的功能,都是将 src 中的字符串,复制拼接到 dest 的末尾。
- strcat() 没有边界控制,因此可能会由于 src 的过长而导致内存溢出。
- strncat() 有边界控制,最多复制 n+1 个字符(其中最后一个是 ‘\0’ )到 dest 的末尾。
函数strtok
- 注意:
-
- 该函数会将改变原始字符串 str,使其所包含的所有分隔符变成结束标记 ‘\0’ 。
- 由于该函数需要更改字符串 str,因此 str 指向的内存必须是可写的。
- 首次调用时 str 指向原始字符串,此后每次调用 str 用 NULL 代替。
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "apple,banana,orange,grape";
char *token = strtok(str, ",");
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, ","); // 继续分割
}
return 0;
}
/*
在上面的例子中,我们首先使用strtok函数将字符串str按照逗号分隔成多个子字符串,
然后使用while循环遍历每个子字符串,直到没有更多的子字符串为止。每次调用
strtok(NULL, ",")会继续从上一次分割的位置开始,直到分割完整个字符串。
*/
函数strcpy与strncpy
- 注意:
-
- 这两个函数的功能,都是将 src 中的字符串,复制到 dest 中。
- strcpy() 没有边界控制,因此可能会由于 src 的过长而导致内存溢出。
- strncpy() 有边界控制,最多复制 n+1 个字符(其中最后一个是 ‘\0’ )到 dest 中。
- strcyp 函数的结束条件只有一个:遇到src中的结束符,因此有可能由于src过大导致异常退出
- strncpy 函数的结束条件有两个: 遇到src中的结束符 + 达到指定的大小N
函数strcmp与strncmp
- 注意:
- 比较字符串大小,实际上比较的是字符的 ASCII码值的大小。
- 从左到右逐个比较两个字符串的每一个字符,当能“决出胜负”时立刻停止比较。
- 返回值是第一个差异字符的差值
- 结束条件:
- strcmp 函数只有两个结束条件: 遇到结束符 + 遇到有差值
- strncmp 函数只有三个结束条件: 遇到结束符 + 遇到有差值 + 达到n个字符
内存拷贝函数 memcpy
#include <string.h>
void *memcpy(void *dest, const void *src, size_t n);
参数分析:
dest --> 拷贝到的目标地址
src --> 需要拷贝的原始数据
n --> 期望拷贝的字节数
返回值:
返回目标地址 dest
该函数的结束条件只有一个,就是拷贝的字节数达到了用于的期望值 N 。内存中尽管全部都是结束符也会把这些结束符一一拷贝。
示例:
char msg [128] = "Hello Even Jacy GZ2407";
msg [5] = 0 ; // 手动在Hello 后面添加了 结束符 \0
char * map1 = calloc(1,128);
char * map2 = calloc(1,128);
strncpy(map1 , msg , 128 ); // 当遇到Hello 后面的结束符会停止工作
memcpy (map2 , msg , 128 ); // 会一直拷贝直到拷贝了128字节为止
printf("map1:%s %s \n" , map1 , map1 +6 );
printf("map2:%s %s\n" , map2 , map2 +6);
free(map1);
free(map2);
内存数据比较 memcmp
#include <string.h>
int memcmp(const void *s1, const void *s2, size_t n);
参数分析:
s1 --> 需要比较的地址1
s2 --> 需要比较的地址2
n --> 期望比较的字节数
返回值:
返回两个内存间数据的差值(按字节比较)
如果完全匹配则返回 差值0
如果不匹配则返回第一个差异点的差值 非零
该函数的结束条件只有一个,就是比较的字节数达到了用于的期望值 N 。内存中尽管全部都是结束符也会把这些结束符一一比较。它与strcmp的区别是strcmp 函数在遇到第一个结束符后会停止比较,后面的数据它无法比较。
总结:
所有的str开头的函数比如strstr \ strcpy \ strcmp.. 这些函数都会在遇到结束符时停止工作,因此在某些场合无法使用str进行某些操作,可以考虑mem开头的函数 比如 memcpy \ memcmp 。。。。
membarrier memchr memcpy memfrob memmove memrchr memusage
memalign memccpy memcmp memfd_create memmem mempcpy memset
memusagestat
C库函数 - atoi()
描述
C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为int 型)。
声明
下面是 atoi()函数的声明。
int atoi(const char *str)
参数
- str -- 要转换为整数的字符串。
返回值
该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。
实例
下面的实例演示了 atoi()函数的用法。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int val;
char str[20];
strcpy(str, "98993489");
val = atoi(str);
printf("字符串值= %s, 整型值 = %d\n", str, val);
strcpy(str, "runoob.com");
val = atoi(str);
printf("字符串值= %s, 整型值 = %d\n", str, val);
return (0);
}
让我们编译并运行上面的程序,这将产生以下结果:
字符串值 = 98993489, 整型值 = 98993489字符串值 = runoob.com, 整型值 = 0
结语:
在本文中,我们深入探讨了C语言中的字符串处理函数及其重要性。从基本的字符串操作函数如 strlen
、strcpy
、strcat
到更复杂的字符串搜索和比较函数,每个函数在处理字符数据时都扮演着不可或缺的角色。掌握这些函数不仅有助于我们提高编程的效率和可读性,还能让我们更好地理解内存管理和数据处理的底层机制。