strtok()字符串分隔函数
1函数定义
#include <string.h>
char *strtok(char *str, const char *delim);
2函数说明
2.1入口参数
char *str
:第一次调用传入strtok
时需要传入将被分隔的字符串。后续调用只需传入NULL
即可。
char *delim
:strtok
根据该参数中的分隔符来对str
中的字符串进行分隔,这个参数可以有多个字符。
2.2返回值
返回被分隔后的字符串的指针。
3代码举例
#include <stdio.h>
#include <string.h>int main()
{char str[] = "This is test,code ha@haa";char *token;int num = 0;const char s[3] = " ,@"; // str will be break by ' ' and ',' and '@' character/* get the first string */token = strtok(str, s); // after this line, the str would be distroyed/* get the follows strings */while(token != NULL) { //when strtok return NULL, end of string is reachednum++;printf("token = %s\n", token);printf("%d called. str = %s\n\n", num, str); // you can find that str is destoriedtoken = strtok(NULL, s); // first param set NULL is OK.}return 0;
}
上面这段代码是有问题的,测试结果没任何输出,但是只需要修改一个地方就可以了,你知道问题在哪吗?为什么会出问题?
答案:因为代码第9行" ,@"
这段字符串常量在内存中是以如下方式存储的:
' '
(空格)','
'@'
'\0'
但是const char s[3]
只有三个字符空间所以没有'\0'
结束符,导致strtok
无法正确识别分隔符。
如果修改const char s[3]
为const char s[4]
或const char s[]
问题就解决了。运行后打印输出如下:
token = This
1 called. str = Thistoken = is
2 called. str = Thistoken = test
3 called. str = Thistoken = code
4 called. str = Thistoken = ha
5 called. str = Thistoken = haa
6 called. str = This
4需要注意的点
通过打印你也可以发现,原来的字符串char str[]
被破坏了,实验发现,strtok(str, s);
被调用后,str
的第一个分隔符对应的位置被替换成了\0
结束符。如果要保持原字符串的完整,可以使用strchr
和sscanf
的组合等(没太明白)。