我是 C 语言新手。
我正在尝试消除“.,;?!”使用 strtok 从字符串创建一个没有任何标点符号的简单字符串,但编译后它给了我一个“段错误”。为什么以及如何解决它?
char simple_s[100];
char delim[20];
memset(simple_s,0,100);
memset(delim,0,100);
strcpy(delim,strtok(s,",.;:!? "));
while(delim != NULL) {
strcat(simple_s,delim);
strcpy(delim,strtok(NULL,",.;:!? "));
}
printf("%s",simple_s);
最佳答案
代码中有几个错误。首先,您使用
将太多字节归零char delim[20];
memset(delim,0,100);
要避免此错误,您应该使用
char simple_s[100];
char delim[20];
memset(simple_s,0,sizeof(simple_s));
memset(delim,0,sizeof(delim));
接下来,您使用了 strtok()
的返回值,然后检查它是否为 NULL
strcpy(delim,strtok(s,",.;:!? "));
然后从那里继续测试 delim
是否为 NULL
,而不是检查来自 strtok() 的
NULL
指针
while(delim != NULL) {
strcat(simple_s,delim);
strcpy(delim,strtok(NULL,",.;:!? ")); // <--- copying from NULL pointer
}
但是 delim
甚至不是必需的,您需要使用 strtok()
返回的指针。把它重新组合起来,我就会
char simple_s[100] = ""; // initialise string
char seps[] = ",.;:!? "; // added separators, so not to duplicate
char *tok; // added to receive value from strtok()
tok = strtok(s, seps);
while(tok) { // until `NULL` returned
strcat(simple_s, tok);
tok = strtok(NULL, seps);
}
printf("%s",simple_s);
此外,我跳过了字符串长度检查。当您让它工作时,请在 strcat()
下一个子字符串之前检查 simple_s[]
的新长度是否不会中断。
关于c - 在C中,strtok导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33946188/