先说说一个使用strtok经常遇见的问题:
char *str = "Fred John Micheal";
char buf[4];
int i = 0;
while((buf[i] = strtok(str, " ")) != NULL)
{
i++;
str = NULL;
}
上面这段代码在运行的时候会出现Segment fault,原因是strtok函数会改变第一个参数的值,而str是一个常量,所以会出错。
如果将str的定义做以下改变:
char str[100] = "Fred John Micheal";
结果就会正确了。
第一种声明方式虽然声明的也是一个字符串,str这个指针是放在堆栈区的,但是字符串的内容却是放在静态区的,所以是常量不能改变。
下面介绍一下strtok和strtok_r的实现原理:
1.strtok
函数原型:
char *strtok(char *str1, char *str2);
strtok函数在实现的过程中使用了一个静态变量,在第一次截取了分隔符前面的字符串并返回以后,函数会修改原始字符串将分隔符位置的字符修改为"/0",静态变量会指向其后面的字符串的首字母。以后每次再截取的时候第一个参数设为