2016-04-23 3 views
0

Когда цикл while запускается после первого раза, он дважды выводит приглашение «Создать новый узел», прежде чем вводить пользователя из stdin. Почему это? См. Связанное изображение.C-While-Loop Duplicating Print Statement

Код:

int main() 
{ 
    char userInput[2]; 
    while(1) 
    { 
    printf("\nCreate new node? (y/n)\n"); 
    printf(">>> "); 
    fgets(userInput, 2, stdin); 

    if(strcmp(userInput, "y") == 0) 
    { 
     printf("Yes\n"); 
    } 

    else if(strcmp(userInput, "n") == 0) 
    { 
     printf("No\n"); 
     exit(0); 
    } 
    } 
} 

Терминал Выход:

enter image description here

+0

Ожидается публикация текста в виде текста, а не изображений! – Olaf

+0

при вызове 'fgets()' всегда должен проверять (! = NULL) возвращаемое значение, чтобы гарантировать успешную операцию. – user3629249

+0

массив: 'userInput' имеет длину всего два символа. поэтому, используя 'fgets()' только один символ за раз может быть израсходован из stdin. Это означает, что если пользователь вводит: 'n ' '' '' 'будет потребляться, то в следующем цикле' 'будет потребляться, а код будет снова зацикливаться, чтобы получить следующий фактический вход пользователей. Предложите сделать 'userInput []' несколько символов дольше, например, 2 или 3 символа. – user3629249

ответ

1

fgets чтения строки плюс '\0' плюс '\n'. Поскольку userInput имеет только 2 байт, '\n' не будет считаться fgets и будет находиться во входном буфере. На следующей итерации fgets будет читать '\n', оставленный предыдущим вызовом fgets.

Увеличение размера буфера, и вы не будете иметь никаких проблем

char userInput[3]; 

или вы можете поместить

int ch; 
while((ch = getchar()) != '\n' && ch != EOF); 

только после fgets заявления.

+0

Работает как шарм, спасибо! – CosmicBadger