繁体   English   中英

在C中使用regexec / strtok_r时出现分段错误

[英]Segmentation fault when using regexec/strtok_r in C

我在弄清楚我收到分段错误的位置和原因时遇到了问题。

我正在编写一个C代码,提示用户输入正则表达式并编译它,然后输入一个包含多个句子的字符串:

int main(void){

  char RegExp[50];
  regex_t CompiledRegExp;
  char *para;
  char delim[] = ".!?,";
  char *sentence;
  char *ptr1;

  printf("Enter regular expression: ");
  fgets(RegExp, 50, stdin);

if (regcomp(&CompiledRegExp,RegExp,REG_EXTENDED|REG_NOSUB) != 0) {                        

    printf("ERROR: Something wrong in the regular expression\n");                         

    exit(EXIT_FAILURE);                                                                   

  }

  printf("\nEnter string: ");

strtok_r用于将字符串拆分为以下任一分隔符。,?! 然后生成的标记(句子)用作regexec函数中的字符串参数,该函数搜索它以查看先前编译的正则表达式是否包含在标记中:

if( fgets(para, 1000, stdin)){

    char *ptr = para;
    sentence = strtok_r(ptr, delim, &ptr1);

    while(sentence != NULL){

      printf("\n%s", sentence);

      if (regexec(&CompiledRegExp,sentence,(size_t)0,NULL,0) == 0) {
        printf("\nYes");
      } else {
        printf("\nNo");
      }
      ptr = ptr1;
      sentence = strtok_r(ptr, delim, &ptr1);

    }
  }
regfree(&CompiledRegExp);
}

这可能是我犯的一个愚蠢的错误,但任何帮助找到segfaul的原因将不胜感激!

编辑: regfree移动到更合适的位置。 但是,段错误仍在发生。 我很确定它与正则表达式的读取方式或regexec中的比较方式有关。 但是,无能为力。

而不是这个:

char *para;
fgets(para, 1000, stdin);

写这个:

char para[1000];
fgets(para, 1000, stdin);

在第一个变体中, para是指向内存中某处的指针,并且在某处用户输入的字符串被写入。 最有可能的是, para指向一些无效的地址,会立即导致程序崩溃。

你在循环中调用了regfree。 围绕循环第二次使用未定义的行为在释放的内存上调用regexec。

您正在使用strtok_r()错误。

要使用strtok_r()解析字符串,在第一次调用中,第一个参数是指向要解析的字符串的指针。 后续调用strtok_r()来解析相同的字符串应该将NULL作为第一个参数传递。 你在做什么:

ptr = ptr1;  
sentence = strtok_r(ptr, delim, &ptr1); 

没有意义。

暂无
暂无

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

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