我在弄清楚我在哪里以及为什么收到段错误时遇到了问题。
我正在编写一个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用于使用以下两个分隔符之一来分割字符串。然后将所得的 token (句子)用作regexec函数中的字符串参数,该函数将对其进行搜索以查看 token 中是否包含先前编译的正则表达式:
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
移动到更合适的位置。但是,segfault仍在发生。我很确定,它与正则表达式的读取方式或regexec
中的正则表达式的读取方式有关。毫 headless 绪。 最佳答案
代替这个:
char *para;
fgets(para, 1000, stdin);
这样写:
char para[1000];
fgets(para, 1000, stdin);
在第一个变体中,
para
是一个指针,指向内存中的某个位置,并向该位置写入用户输入的字符串。很有可能,para
指向某个无效的地址,立即使程序崩溃。关于c - 在C中使用regexec/strtok_r时出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36804215/