Ошибка сегментации буфера токенизации
Итак, я предполагаю, что здесь упускаю что-то довольно простое, но я пытаюсь прочитать файл построчно, разбивая буфер по ходу. Я вставил основы того, что я пытаюсь сделать с моим кодом. У меня никогда не было проблем со 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