gpt4 book ai didi

c - 第二次使用 fgets 时出现段错误

转载 作者:行者123 更新时间:2023-11-30 16:32:24 25 4
gpt4 key购买 nike

这是我的完整代码:

#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 任何东西。

最佳答案

程序中的崩溃来自这一行:

sentence = strtok_r(inputString,Limits,cont);

要超越它,您必须将 cont 声明为 char * 并将其地址传递给 strtok_r:

sentence = strtok_r(inputString, Limits, &cont);

为了避免无限循环,在 while 语句中的 strtok_t 中,您必须将 inputString 更改为 NULL,按照 strtok_r 手册页中指定的方式:

On the first call to strtok_r(), str should point to the string to be parsed, and the value of saveptr is ignored. In subsequent calls, str should be NULL, and saveptr should be unchanged since the previous call.

因此对 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);
}

关于c - 第二次使用 fgets 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50165544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com