簡體   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