在 C 中使用正则表达式/strtok_r 时出现分段错误



我在弄清楚我在哪里以及为什么收到分段错误时遇到了问题。

我正在编写一个 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 expressionn");                         
    exit(EXIT_FAILURE);                                                                   
  }
  printf("nEnter string: ");

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

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。第二次循环时,您在具有未定义行为的释放内存上调用正则表达式。

您不正确地使用了strtok_r()

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

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

毫无意义。

相关内容

  • 没有找到相关文章

最新更新