【问题标题】:In C, strtok causes segmentation fault在 C 中,strtok 导致分段错误
【发布时间】:2015-11-26 20:00:04
【问题描述】:

我是 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); 不好!
  • strcpy(delim,strtok(s,",.;:!? ")); 之前你检查delim NULL不好!
  • 我删除了它,但错误仍然存​​在。
  • 你删除了什么?您将尺寸错误归零。这就是为什么这样做是一种很好的做法:memset(delim,0,sizeof(delim));
  • while(delim != NULL) - 这等同于while(1),因为delim 永远不会是NULL(你甚至不能改变它)。

标签: c string strtok


【解决方案1】:

代码中有几个错误。首先你用

将太多字节归零
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);

另外,我跳过了字符串长度检查。当你让它工作时,检查simple_s[] 的新长度不会中断,然后再strcat() 下一个子字符串。

【讨论】:

  • 感谢您的时间和解释。现在我明白我的错误了。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2014-04-24
    相关资源
    最近更新 更多