2013-12-08 6 views
1

Я пытаюсь взять строку пользовательского ввода от stdin, используя fgets, tokenize его с strtok, а затем распечатать каждый токен, чтобы убедиться, что он был правильно маркирован. Мой код выглядит следующим образом:Ошибка сегментации при печати токенов strtok

char buffer[256]; 
char *token;` 
fgets(buffer, 256, stdin); 
token=strtok(buffer," \n\t()<>|&;"); 

while(token!=NULL) { 
     printf("%s",token); 
     count++; 
     token = strtok(NULL," \n\t()<>|&;"); 
} 

Я получаю ошибку сегментации, когда я добираюсь до printf вызова, однако, и я не могу показаться, чтобы выяснить, почему именно.

+2

Я только что протестировал его, и он отлично работает. Вы уверены, что не получите segfault из другой части программы? –

+1

Короткая программа, использующая только этот код, работает нормально, без ошибки сегментации. Можете ли вы опубликовать фрагмент кода, который не удается? –

+0

@MartinMajer Помещение только кода выше в основной функции вызывает segfault всякий раз, когда я запускаю его, независимо от того, что я вводил. Добавляя отпечатки, чтобы проверить, где произошла ошибка, он, похоже, находится на printf, который печатает токен, в качестве печати, которая происходит до того, как эта точка будет выполнена, но я получу segfault перед последующей печатью. – sven

ответ

0

Хорошо, я изменил свой код в полную программу, ср:

#include <stdio.h> 
#include <string.h> 

int main() { 
    char buffer[256]; 
    char *token; 
    int count = 0; 
    fgets(buffer, 256, stdin); 
    token=strtok(buffer," \n\t()<>|&;"); 

    while(token!=NULL) { 
     printf("%s\n",token); 
     count++; 
     token = strtok(NULL," \n\t()<>|&;"); 
    } 
    return 0; 
} 

, когда я запускаю его в его первоначальной форме она работает

bash $ ./a.out 
the quick brown fox 
thequickbrownfoxbash $ 

Хотя, конечно, не должно быть пробелов или символов новой строки , Когда я добавляю \n, (как в коде выше) я получаю

bash $ ./a.out 
the quick brown fox 
the 
quick 
brown 
fox 
bash $ 

Теперь, обратите внимание, что я должен был удалить резервную клещу (я предполагаю, что это была опечатка), и я должен был объявить count переменные, но с учетом того, что он работает.

Из этого я выводю, что у вас, вероятно, есть код вокруг фрагмента, который вы показали нам, который виноват.

+2

. Меня смущало, почему я все еще получаю segfaults после прочтения всех комментариев и ответов здесь. Затем я снова посмотрел на вас и понял, что я тупо забыл «#include ' – sven

+0

Huh. Это даже не скомпилировало бы меня без него. (Из чего вы можете сделать вывод, что я должен был добавить его сам :-) –

+0

Я думал, что это было странно, что он скомпилирован без него. Но добавив, что там исправлена ​​проблема! – sven

2

Я не вижу проблемы с вашим кодом (кроме блуждающего ` в конце второй строки, который, как я полагаю, не находится в вашем фактическом коде).

Однако эта линия:

 printf("%s",token); 

никогда не будет печатать любую строку, а это значит, что он никогда не будет вымывать выходной буфер. Поэтому, если у вас есть ошибка сегментации позже в вашей программе, возможно, выглядит, как это происходит до того, как вы напечатаете первый токен, просто потому, что он предотвращает сброс выходного буфера.

Для целей отладки, попробуйте изменить выше этого:

 printf("%s\n",token); 

и видеть то, что печатается перед Segfault.

Смежные вопросы