问题
最近使用strtok函数分割字符串,代码异常退出,报段错误。
错误代码如下
#include "string.h"
#include <stdio.h>
int main(){
char *a = "ni hao wos s sd"; // 错误做法
// char a[] = "ni hao wos s sd"; // 正确做法
char *b = strtok(a," ");
while(b != NULL){
printf("TOKEN:%s",b);
b = strtok(NULL, " ");
}
return 0;
}
如果 a变量是一个char * 时,会报错,而将a改成数组,就不会报错。
原因是 strtok 会修改参数,使用gdb调试,可以看到strtok会在原始字符中插入’\0’。
(gdb) p a
$5 = "ni\000hao\000wos s sd"
char *a = “ni hao wos s sd”; 指向常量,不能修改。
而 char a[] = “ni hao wos s sd”; 是将字符常量拷贝到栈里面,是可以修改内容的。