2012-11-14 11 views
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; 
} 

出力は第二の入力はスキップされました。このscanf関数は、入力のために

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 

のように見える二回目を要求しません。どうして?

+0

これは数百回の議論がされています。既存の質問に関する少しの研究をしてみてください – fayyazkl

答えて

3

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

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

代わりに、scanf("%d", &order);は数(この場合は45)を消費した後、その後左に改行がまだあるすべての入力のためのgetchar()を使用し、\ nは

+0

さて、私はちょっと試してみましょう。しかし、私は 'fgets(..)'を試みました、そしてそれはあまりにも苦しみ、より安全であると考えられました。 – user1012451

+0

ここでも、fgetsには最後に改行が含まれています。値を入力する前に、改行をヌルに置き換えるだけです – John

3

を確認してください。 scanf("%d\n", &order)を使用してリターンを消費させることができます。空白をスキップするのscanf最大限のコンバージョンについては

scanf() leaves the new line char in buffer?

1

が、char形式(「%cの」)のために、あなたは、明示的なスペースを使って、ホワイトスペースをスキップする必要があります。

これにもう一つの答えがここにありますここで説明したような形式(「%cの」)で:

C - trying to read a single char

これもscanfドキュメントで説明されているが、それは混乱だと何かeを使用する方が良いかもしれ他の人が言及しているようにlse。

1

あなたはこれが起こっている、標準入力ですでにので改行文字の)(

printf("enter cont y or n: "); 
fflush(stdin); 
scanf("%c", &cont); 
8

をfflushは使用することができます。 %cの前に、代わりに

scanf("%c", &cont); 

ノート1つの空間の 使用

scanf(" %c", &cont); 

関連する問題