Ошибка сегментации появляется при повторном использовании fgets - PullRequest
0 голосов
/ 04 мая 2018

Это мой полный код:

#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)

Я действительно в растерянности относительно того, почему это происходит, поскольку первые фэгеты, кажется, проходят. Я не уверен, должен ли я быть malloc что-то по той же причине, что и выше.

1 Ответ

0 голосов
/ 04 мая 2018

Сбой в вашей программе происходит из этой строки:

sentence = strtok_r(inputString,Limits,cont);

Чтобы превзойти его, вы должны объявить cont как char * и передать его адрес strtok_r:

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

И чтобы избежать бесконечного цикла, в strtok_t в операторе while необходимо изменить inputString на NULL, способом, указанным на strtok_r man-странице:

При первом вызове strtok_r () str должен указывать на строку, которая будет анализируется, и значение saveptr игнорируется. В последующих звонках, ул должен быть 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);
}
...