6
#include "stdio.h"

int main(void)
{

     int order, nextp, N=3;
     char cont;
     nextp = 0;
     printf("\nShould we continue (y or n): ");
     scanf("%c", &cont);
     if (cont != 'y') return;
     for(; nextp < N; nextp++)
     {
        printf("Enter order number: ");
        scanf("%d", &order);
        printf("you have entered %d\n", order);
        printf("okay now continue with cont\n");


        printf("enter cont y or n: ");
        scanf("%c", &cont);
        if (cont != 'y')
        {
            printf("\nnot equal to y\n");
            break;
        }
        printf("after intepreting t[0]");
      }

   return 0;
}

出力は次のようになります

Should we continue (y or n): y
Enter order number: 45
you have entered 45
okay now continue with cont
enter cont y or n: 
not equal to y

2 番目の入力はスキップされました。なんで?

4

5 に答える 5

9

stdin にすでに改行文字があるため、これが発生しています。使用する

scanf(" %c", &cont); 

それ以外の

scanf("%c", &cont);

%c の前の 1 つのスペースに注意してください。

于 2013-08-22T14:11:42.913 に答える
4

数値 (この場合は 45) を消費した後scanf("%d", &order);も、その後に改行が残っています。scanf("%d\n", &order)リターンを消費させるために使用できます。

これに対する別の答えはここにあります:

scanf() は新しい行の文字をバッファに残しますか?

于 2012-11-14T04:18:35.570 に答える
3

これが、scanf通常、文字入力に好まれない理由です。前の入力の後にキャリッジ リターンが残っています。

たとえばgetchar()、注文入力の後に a を追加すると、問題は解決しますが、それはきれいなコードではありません。cont != 'y'に代入することで、これを明示的に確認することもできますcont != '\n'

代わりに、getchar()すべての入力に使用して \n を確認してください

于 2012-11-14T04:17:37.560 に答える
1

ほとんどの変換では、scanfは空白をスキップしますが、char形式( "%c")の場合は、ここで説明するように、形式( "%c")で明示的なスペースを使用して空白をスキップする必要があります。

C-単一の文字を読み込もうとしています

これはscanfのドキュメントでも説明されていますが、混乱を招くため、他の人が言及しているように他のものを使用する方がよい場合があります。

于 2012-11-14T04:40:46.980 に答える
1

fflush() を使用できます

printf("enter cont y or n: ");
fflush(stdin);
scanf("%c", &cont);
于 2012-12-13T09:03:05.747 に答える