C语言如何实现将字符串
ABCD-efgh-i1234,David-Julie-Susan
中-
和,
分隔开的几个字串ABCD
efgh
i1234
David
Julie
Susan
取出来?
有个函数叫 strtok()
#include <stdio.h>
#include <string.h>
int main(void)
{
char buf[] = "ABCD-efgh-i1234,David-Julie-Susan";
char splitstr[6][10];
char *tok;
int8_t i = 0;
tok = strtok(buf, "-");
while (tok)
{
strcpy(splitstr[i], (const char *)tok);
printf("splitstr[%d]=%s\n",i, splitstr[i]);
i++;
tok = strtok(0, "-,");
}
return 0;
}
运行结果:
splitstr[0]=ABCD
splitstr[1]=efgh
splitstr[2]=i1234
splitstr[3]=David
splitstr[4]=Julie
splitstr[5]=Susan
1. 函数原型
char *strtok(char s[], const char *delim);
参数说明:s
为要分解的字符串,delim
为分隔符字符串。delim
字符还可以是多个,不一定只为一个,多个字符连起来放在双引号间,上面的例子中是短横线和逗号"-,"
。但是当只要遇到其中任意一个就可以分割,并不要求分隔的字符连起来才能分割。
2.定义
strtok()
分解字符串为一组字符串。s为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。在头文件#include<string.h>中。
3.说明
-
当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。
-
第一次调用时候,strtok函数从不是分隔符的第一个字符开始搜索,找到第一个是分隔符为止,将其替换为‘\0’作为结束。但是函数此时已经保存了分隔符之后的那个字符,因此后续再调用strtok时,第一个参数为NULL,继续将string标记化(切割)。NULL参数表示调用strtok继续从string中上次调用 strtok时保存的位置开始标记化。
-
返回值
从s开头开始的一个个被分割的字符串指针。当s中的字符查找到末尾时,即调用strtok时已经没有标记(分隔符),则strtok返回NULL。返回NULL。如果查找不到delim中的字符时,返回当前strtok的字符串的指针。所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。 -
需要注意的是,使用该函数进行字符串分割时,会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。第一次分割之后,原字符串str是分割完成之后的第一个字符串,剩余的字符串存储在一个静态变量中,因此多线程同时访问该静态变量时,则会出现错误。
4.使用
strtok函数会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。如果要保持原字符串的完整,可以使用strchr和sscanf的组合等。
参考文献: