C 第二次使用fgets时出现分段错误

C 第二次使用fgets时出现分段错误,c,string,segmentation-fault,fgets,C,String,Segmentation Fault,Fgets,这是我的完整代码: #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

这是我的完整代码:

#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似乎已经通过了。我不确定我是否应该是malloc,原因与上述相同。

您程序中的崩溃来自以下几行:

sentence = strtok_r(inputString,Limits,cont);
要超越它,您必须将
cont
声明为
char*
,并将其地址传递给
strtok\r

sentence = strtok_r(inputString, Limits, &cont);
为了避免无休止的循环,在
strtok\u t
while
语句中,您必须按照
strtok\r
手册页中指定的方式将
inputString
更改为
NULL

在第一次调用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);
}

这个声明应该做什么<代码>如果(fgets(inputexp,255,stdin)!=NULL)你在某处撞车了。您可能需要调试它。
if (fgets(inputString, 255, stdin) != NULL) {
    fprintf(stderr, "Error while reading input text\n.");
    exit(EXIT_FAILURE);
}