繁体   English   中英

在C中,strtok导致分段错误

[英]In C, strtok causes segmentation fault

我是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));

接下来,在检查它是否为NULL之前,已使用strtok()的返回值。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM