今天想自己实现一个分割字符串的函数,然后先调查了一下c语言中的strtok是怎么实现的。
有如下测试代码段:
#define STR_SEP " \t\n\r"
int main()
{
char buffer[100] = " My name is CSDN ";
char *token = strtok( buffer, STR_SEP);
while( NULL != token)
{
printf("%s\n", token);
token = strtok(NULL, STR_SEP);
}
return 0;
}
开始执行程序前,buffer在内存中的值如下
执行语句:
char *token = strtok( buffer, STR_SEP);
首先将鼠标定位到buffer上,看看编译器显示buffer的值变成什么了
居然只剩“ My”了,然后看下内存中是什么
从上图可以看出,strtok居然改变了原始字符串中的值,将有效内容后面的第一个分隔符变成了'\0'。我们看下token指向了哪里
token = 0x0012fefd,指向了buffer的‘M’字符,第一个分隔符也被过滤掉了,由于第一个分隔符变成了'\0',所以打印token输出"My".继续运行程序,执行如下语句
token = strtok(NULL, STR_SEP);
这里strtok的第一个参数变成了NULL,没有了目标字符串,函数是如何继续执行的?这里不太清楚,觉得一个静态指针或者全局指针指向未处理的部分都很合理吧。
按照上面的逻辑,可以推出执行完上面的语句后token指向了'n'。
strtok对原始输入有改变,最好还是根据自己的应用场景仔细考虑该不该用这个函数吧。