搜索字符串函数 strstr 原型: extern char *strstr (char *__haystack, const char *__needle)
所在头文件:#include <string.h>
功能:从字符串haystack中寻找needle第一次出现的位置(不比较结束符NULL)。
说明:返回指向第一次出现needle位置的指针,如果没找到则返回NULL。
#include <stdio.h> #include <string.h> int main(void) { char haystack[] = "xiaojunyu"; char needle[] = "jun"; char *buf=strstr(haystack,needle); buf = strstr(haystack, needle); printf("%s",buf); return 0; }
运行结果:junyu
切割字符串函数 strtok
原型:extern char *strtok (char *__restrict __s, const char *__restrict __delim)
功能:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。实质上的处理是,strtok在s中查找包含在delim中的字符并用NULL(’/0′)来替换,直到找遍整个字符串。 说明:首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。strtok在s中查找包含在delim中的字符并用NULL(’/0′)来替换,直到找遍整个字符串。
返回值:从s开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。
#include <stdio.h> #include <string.h> int main(void) { char buf[] = "1,,2,,|,3-4,,,5|6"; char *token; for (token = strtok(buf, ",-|"); token != NULL; token = strtok(NULL, ",-|")) { printf("%s@", token); } return 0; }
运行结果:1@2@3@4@5@6@
切割字符串函数 strsep
原型:extern char *strsep (char **__restrict __stringp, const char *__restrict __delim)
功能:分解字符串为一组字符串。从stringp指向的位置起向后扫描,遇到delim指向的字符串中的字符后,将此字符替换为NULL,返回stringp指向的地址。它适用于分割“关键字”在两个字符串之间只“严格出现一次”的情况 说明:和strsok不同的是,直接看结果
#include <stdio.h> #include <string.h> int main(void) { char buf[] = "1,,2,,|,3-4,,,5|6"; char *buff = buf; char *token; for (token = strsep(&buff, ",-|"); token != NULL; token = strsep(&buff, ",-|")) { printf("%s@", token); } return 0; }
运行结果:1@@2@@@@3@4@@@5@6@
总结:
strstr用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL
strtok内部记录上次调用字符串的位置,所以不支持多线程,可重入版本为strtok_r,有兴趣的可以研究一下。它适用于分割关键字在字符串之间是“单独”或是 “连续“在一起的情况。
strsep返回值为分割后的开始字符串,并将函数的第一个参数指针指向分割后的剩余字符串。它适用于分割关键字在两个字符串之间只严格出现一次的情况。 不过据说linux内核里面已经放弃了strtok而用的是strsep,等以后有需要了再研究