在C中,strtok导致分段错误

时间:2015-11-26 20:00:04

标签: c string strtok

我是C的新手。

我试图消除"。,;?!"从一个字符串使用strtok然后创建一个没有任何标点符号的简单字符串,但它给了我一个“分段错误”#39;编译后。为什么以及如何解决它?

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

2 个答案:

答案 0 :(得分: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));

接下来,在检查strtok()

之前,您已使用NULL的返回值
strcpy(delim,strtok(s,",.;:!? "));

从那里开始测试delimNULL,而不是检查来自NULL的{​​{1}}指针

strtok()

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

答案 1 :(得分:0)

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