这是我的完整代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <regex.h>
#define SEN_LIMITERS ".!?"
int main()
{
char inputexp[256];
char inputString[256];
const char *Limits = SEN_LIMITERS;
char *sentence;
regex_t expression;
char **cont = NULL;
int Words = 0, index;
printf("Please enter the string to analyse: \n");
if(fgets(inputString,255,stdin) != NULL);
printf("Please enter the regular expression :");
if(fgets(inputexp,255,stdin) != NULL);
inputexp[strlen(inputexp)-1] = '\0';
if (regcomp(&expression,inputexp,REG_EXTENDED) != 0) {
printf("ERROR: Something wrong in the regular expression\n");
exit(EXIT_FAILURE);
}
sentence = strtok_r(inputString,Limits,cont);
while(sentence != NULL){
printf("%s\n",sentence);
if (regexec(&expression,sentence,0,NULL,0) == 0) {
printf("Yes ");
} else {
printf("No ");
}
for (index = 0;sentence[index] != '\0';index++)
{
if (sentence[index] == ' ')
Words++;
}
printf("%d words\n",Words);
Words = 0;
sentence = strtok_r(inputString,Limits,cont);
}
return(EXIT_SUCCESS);
}
//停止
由于某种原因,当我运行它时,分段错误发生在第二个fgets之后。
Please enter the string to analyse:
abba and a bee. aah mama mia. there we go again. in the city of miami.
Please enter the regular expression :a[bm].*[ai]
Segmentation fault (core dumped)
我真的不知道它为什么会发生,因为第一个fgets似乎已经完成了。我不确定如果出于与上述相同的原因我应该是malloc。
答案 0 :(得分:0)
你的程序崩溃来自这一行:
sentence = strtok_r(inputString,Limits,cont);
要超越它,您必须将cont
声明为char *
并将其地址传递给strtok_r
:
sentence = strtok_r(inputString, Limits, &cont);
为了避免无限循环,在strtok_t
语句的while
中,您必须按照inputString
中指定的方式将NULL
更改为strtok_r
手册页:
在第一次调用strtok_r()时,str应指向该字符串 解析,并忽略saveptr的值。在随后的电话中,str 应为NULL,saveptr应该是 自上一次电话会议以来没有变化。
因此,对strtok_r
的第二次调用应如下所示:
sentence = strtok_r(NULL, Limits, &cont);
另一个注意事项是关于处理fgets
错误案例,这些错误案例不能仅通过分号;
进行,您可以通过类似的方式执行此操作:
if (fgets(inputString, 255, stdin) != NULL) {
fprintf(stderr, "Error while reading input text\n.");
exit(EXIT_FAILURE);
}