我尝试使用strtok函数在许多标记中拆分字符串,但在此示例中它返回了一个seg。错误错误。哪里我错了?
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv){
int i=0;
char * string = "HI:HOW:ARE:YOU:?", *tmp;
while(1){
if(i==0) tmp=strtok(string,":");
else tmp=strtok(NULL,":");
if(tmp==NULL) break;
printf("%s\n",tmp);
i++;
}
return 1;
}
答案 0 :(得分:3)
更改
char * string = "HI:HOW:ARE:YOU:?"
代表
char string [] = "HI:HOW:ARE:YOU:?"
使用char string []你有一个数组,而char *你有一个指针。声明数组时,它将请求空间来分配字符串的大小。 char *字符串创建一个指向文字字符串的指针。
char * string的问题是不应该更改该点,因为字符串文字通常存储在只读内存中,从而导致undefined behavior 33
(有关详细信息,请阅读此https://www.securecoding.cert.org/confluence/display/seccode/STR30-C.+Do+not+attempt+to+modify+string+literals)
因此,由于使用 strtok ,字符串的内容被修改并分解为较小的字符串(标记),您会遇到问题。