在 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);
}
这可能是我犯的一个愚蠢的错误,但如果能帮助找出段错误的原因,我们将不胜感激!
编辑: 移动regfree
到更合适的位置。但是,段错误仍在发生。我很确定它与正则表达式的读入方式或正则表达式在 regexec
中的比较方式有关。不过一无所知。
您在循环内调用了 regfree。第二次围绕循环调用 regexec 释放未定义行为的内存。
而不是这个:
char *para;
fgets(para, 1000, stdin);
这样写:
char para[1000];
fgets(para, 1000, stdin);
在第一个变体中,para
是一个指向内存中某处 的指针,用户指向某处 - 输入的字符串被写入。最有可能的是,para
指向一些无效的地址,立即使您的程序崩溃。
您使用 strtok_r()
不正确。
要使用 strtok_r()
解析字符串,在第一次调用中,第一个参数是指向要解析的字符串的指针。随后调用 strtok_r()
来解析同一个字符串应该将 NULL
作为第一个参数传递。你在做什么:
ptr = ptr1;
sentence = strtok_r(ptr, delim, &ptr1);
没有意义。
我无法确定我收到分段错误的位置和原因。
我正在写一个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);
}
这可能是我犯的一个愚蠢的错误,但如果能帮助找出段错误的原因,我们将不胜感激!
编辑: 移动regfree
到更合适的位置。但是,段错误仍在发生。我很确定它与正则表达式的读入方式或正则表达式在 regexec
中的比较方式有关。不过一无所知。
您在循环内调用了 regfree。第二次围绕循环调用 regexec 释放未定义行为的内存。
而不是这个:
char *para;
fgets(para, 1000, stdin);
这样写:
char para[1000];
fgets(para, 1000, stdin);
在第一个变体中,para
是一个指向内存中某处 的指针,用户指向某处 - 输入的字符串被写入。最有可能的是,para
指向一些无效的地址,立即使您的程序崩溃。
您使用 strtok_r()
不正确。
要使用 strtok_r()
解析字符串,在第一次调用中,第一个参数是指向要解析的字符串的指针。随后调用 strtok_r()
来解析同一个字符串应该将 NULL
作为第一个参数传递。你在做什么:
ptr = ptr1;
sentence = strtok_r(ptr, delim, &ptr1);
没有意义。