[英]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.