Ошибка сегментации буфера токенизации

Итак, я предполагаю, что здесь упускаю что-то довольно простое, но я пытаюсь прочитать файл построчно, разбивая буфер по ходу. Я вставил основы того, что я пытаюсь сделать с моим кодом. У меня никогда не было проблем со strtok, поэтому я предполагаю, что это связано с буфером, который я использую. Любые толчки в правильном направлении? Я читал, что strtok - не лучший вариант, но это единственное, с чем я знаком (я полагаю, я мог бы написать свою собственную функцию). Он читает первый токен, как и полагается каждый раз. Это не вызывает ошибки, пока я не попытаюсь найти второй токен с помощью "strtok(NULL," ");"

Я не знаю, почему это было отклонено как дубликат. Да, есть ответы, которые рассказывают основы того, что я пытаюсь сделать, но я хочу понять проблему, а не просто вырезать и вставить."Я бы предпочел знать, ПОЧЕМУ существует ошибка сегмента и почему мой Кодекс ведет себя так, как он работает. Не нужно понижать голос, когда я задаю конкретные вопросы, не указанные непосредственно в других сообщениях.

const char *file = "path/to/file/file.txt";
void tokenize();

//Eventually file will be command line opt
FILE *open_file(const char *file);

int main(int argc, char *argv[])
{
    tokenize();
}

void tokenize()
{
    FILE *fp;
    fp = open_file(file);
    char buffer[BUFSIZ];

    while(fgets(buffer,BUFSIZ,fp) != NULL)
    {
        //puts("========================================");
        //puts(buffer);
        //puts("========================================");

        char *data = strdup(buffer);
        char *token;
        token = strtok(data, " ");
        //puts(token);
        while(token != NULL)
        {
            token = strtok(NULL, " ");

            puts("++++++++++++++++++++++++++++++++++++++++++++++");
            puts(token);
            puts("++++++++++++++++++++++++++++++++++++++++++++++");
        }
    }
fclose(fp)
}

FILE *open_file(const char *file)
{
    FILE *fp;
    fp = fopen(file, "r");

    if(fp == NULL)
    {
        perror("Error opening file");
    }
    return fp;
}        

3 ответа

Ваш while цикл проверяет, что token не NULL, но затем изменяет его в первой строке цикла перед его использованием. Второй звонок strtok() должно быть в конце цикла:

    while(token != NULL)
    {
        puts("++++++++++++++++++++++++++++++++++++++++++++++");
        puts(token);
        puts("++++++++++++++++++++++++++++++++++++++++++++++");

        token = strtok(NULL, " ");
    }

Кроме того, не забудьте free(data) в нижней части вашего внешнего while петля. В противном случае у вас утечка памяти.

У вас также есть утечка памяти с

char *data = strdup(buffer);

strdup использования malloc выделить память для строки dup, которую вы несете free, Но вы этого не делаете, и в каждом цикле вы перезаписываете предыдущий выделенный указатель другим, что приводит к утечке памяти.

На самом деле это не ответ, я отредактировал ложный ответ так, как вам нравится.

Спасибо всем! Вот мое решение

while(fgets(buffer,BUFSIZ,fp) != NULL)
{
    char *token;
    token = strtok(buffer, " ");
    while(token != NULL)
    {
        token = strtok(NULL, " ");
        **if(token != NULL)**
        {
            printf("%s\n", token);
        }
    }

}

fclose(fp);

Как указывалось в других ответах, проблема заключалась не в маркировке значения NULL, а в попытке печати значения NULL. Все было хорошо в мире после того, как я добавил проверку if(token!= NULL) в цикле while

Другие вопросы по тегам