在 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[] 的新长度不会中断。