2016-04-23 8 views
0

whileループが最初から実行されるとき、stdinからユーザー入力を取得する前に、「Create new node」プロンプトを2回印刷します。どうしてこれなの?リンクされた画像を見るC - Whileループの複製プリントステートメント

コード:

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'は2文字だけです。だから、 'fgets()'を使うと、一度に1文字だけ標準入力から消すことができます。つまり、ユーザが 'n 'と入力すると、 'n'が次のループで消費され、' 'が消費され、次の実際の入力を得るためにコードが再びループします。 'userInput []'をいくつかの文字を長く、例えば2文字または3文字長くしてください。 – user3629249

答えて

1

fgets読み文字列プラス'\0'プラス'\n'userInput2バイトのみであるため、'\n'fgetsで読み取られず、入力バッファに格納されます。次の繰り返しでは、fgetsは、前の呼び出しであるfgetsによって残された'\n'となります。

は、バッファサイズを大きくして、あなたは何の問題

char userInput[3]; 

を持っていないだろうか、あなただけのfgets文の後

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

を置くことができます。

+0

魅力のように動作します、ありがとう! – CosmicBadger