strtok добавление дополнительной строки? - PullRequest
0 голосов
/ 06 июня 2019

У меня проблемы с чтением и разделением многострочного пользовательского ввода с помощью функции strtok. Мне нужно разделить его на промежутки между ними, однако я думаю, что strtok продолжает добавлять дополнительную строку?

Например:

Пользователь вставит блок текста, например:

324 A 1 D F

829 Z 3 3 F G

1234 C 3 F G

234 D 2 3

Когда я распечатал вывод токенов, он показал мне:

324 A 1 D F

829 Z 3 3 F G

1234 C 3 F G

<--- где случайная новая строка генерируется после нажатия enter --->

234 D 2 3. <- отображается только после того, как сгенерирована случайная строка .. </p>


Строки с 1 по 3, напечатанные в консоли сразу после того, как я вставил блок в консоль. После нажатия Enter, он создает новую строку между ними и, наконец, печатает последнюю строку. Затем я должен нажать Enter еще раз для завершения программы.

Это мой код:

int main(void) {
char input[256];
int done = 1;
while (done!=0){
        fgets(input,256,stdin);
        char* t;
        printf("\n");

        t=strtok(input, " \n");

        if (*t == '\n'){
            done = 0;
        } else{
            while (t!= NULL){
                printf("%s " ,t);
                t = strtok(NULL, " \n");
            }
        }
    }
}

1 Ответ

1 голос
/ 06 июня 2019

Первое правило операций ввода-вывода: никогда предполагается, что они успешны.

  1. Непроверенный результат от fgets.
  2. Если вы strok останавливаетесь (и заканчиваете) или пробел или символ новой строки, как вы ожидаете, что *t будет указывать на символ новой строки.Поэтому done = 0; не будет никогда ударить.Поэтому вы переходите на неудавшиеся fgets вызовы, которые вы никогда не проверяете и т. Д.

Код

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

int main() 
{
    char input[256];

    // check for failure to read, on a line with newline first
    while (fgets(input, 256, stdin) != NULL && *input != '\n')
    {
        char *t = strtok(input, " \n");
        while (t != NULL) 
        {
            printf("%s ", t);
            t = strtok(NULL, " \n");
        }
        fputc('\n', stdout);
    }
}

Ввод

324 A 1 D F
829 Z 3 3 F G
1234 C 3 F G
234 D 2 3

Выход

324 A 1 D F 
829 Z 3 3 F G 
1234 C 3 F G 
234 D 2 3 

Смотрите его в прямом эфире на ideone.com

...