c - 在C中,strtok导致段错误

标签 c string strtok

我是 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/

相关文章:

如果在 opendir 之后未打印路径名,则在使用 closedir 时会转储核心

java - 不同长度的字符串解析

java - 带 String.split() 的正则表达式

c - 带有多个定界符的 strtok

c - 在C中分割字符串并分别获取每个字段

c - c 中的 strtok 有问题

c - 头文件中是否需要函数原型(prototype)?

c - 使用宏 STATIC 的重要性

c - C 中的哈希表总是产生 Seg 错误

python - 如何在 CSV 行中搜索特定列中的字符串,如果找到则将整行打印到文件