【发布时间】:2016-04-22 22:24:20
【问题描述】:
我无法确定收到分段错误的位置和原因。
我正在编写一个 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 中的比较方式有关。然而,毫无头绪。
【问题讨论】:
-
调试器呢?
-
编译调试程序,在调试器下运行程序。调试器会告诉你到底发生了什么。
-
gdb 调试器没有给我任何细节 - 只是声称发现了一个段错误
-
怕是说你用的调试器不对。当 GDB 停止时,bt 将列出导致停止的堆栈跟踪,print nameOfVariable 将打印出 nameOfVariable 的当前状态。当因段错误而停止时,您可以查看导致它的原因并开始读取变量以查看可能导致错误的变量。
-
您的正则表达式不起作用,因为您没有从 fgets 中删除换行符。
标签: c regex segmentation-fault strtok