几个常用的C查找分割字符串函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LunaW/article/details/50495298

搜索字符串函数 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,等以后有需要了再研究

猜你喜欢

转载自blog.csdn.net/LunaW/article/details/50495298