在 C 中,strtok 导致段错误
In C, strtok causes segmentation fault
我是 C 的新手
我正在尝试消除“.,;?!”从一个字符串使用 strtok,然后创建一个没有任何标点符号的简单字符串,但它在编译后给了我一个 'Segmentation fault'。为什么以及如何修复它?
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);
delim 必须定义为 char *。这是修复了几个错误的代码:
#include <stdio.h>
#include <string.h>
#include <strings.h>
int main(int argc, char **argv)
{
char s[100];
char simple_s[100];
char *delim;
strcpy(s, "abc,def");
memset(simple_s,0,sizeof(simple_s));
delim = strtok(s,",.;:!? ");
while(delim != NULL) {
strcat(simple_s,delim);
delim = strtok(NULL,",.;:!? ");
}
printf("%s",simple_s);
return 0;
}
这输出 abcdef
代码中有几处错误。首先,您使用
将太多字节归零
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));
接下来,在检查它是否为NULL
之前,您已经使用了strtok()
的return值
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()
编辑的指针 return。把它放回去,我会
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 的新手
我正在尝试消除“.,;?!”从一个字符串使用 strtok,然后创建一个没有任何标点符号的简单字符串,但它在编译后给了我一个 'Segmentation fault'。为什么以及如何修复它?
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);
delim 必须定义为 char *。这是修复了几个错误的代码:
#include <stdio.h>
#include <string.h>
#include <strings.h>
int main(int argc, char **argv)
{
char s[100];
char simple_s[100];
char *delim;
strcpy(s, "abc,def");
memset(simple_s,0,sizeof(simple_s));
delim = strtok(s,",.;:!? ");
while(delim != NULL) {
strcat(simple_s,delim);
delim = strtok(NULL,",.;:!? ");
}
printf("%s",simple_s);
return 0;
}
这输出 abcdef
代码中有几处错误。首先,您使用
将太多字节归零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));
接下来,在检查它是否为NULL
strtok()
的return值
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()
编辑的指针 return。把它放回去,我会
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[]
的新长度不会中断。