2012-12-11 20 views
6

私はCプログラミングを傾けています。私は奇妙なループを書いたが、に%cを使用している間は動作しません。
は、ここでは、コードです:%cを使用して奇数ループが機能しない

#include<stdio.h> 
void main() 
{ 
    char another='y'; 
    int num; 
    while (another =='y') 
    { 
     printf("Enter a number:\t"); 
     scanf("%d", &num); 
     printf("Sqare of %d is : %d", num, num * num); 
     printf("\nWant to enter another number? y/n"); 
     scanf("%c", &another); 
    } 
} 

しかし、私はこのコードで%sを使用する場合、たとえばscanf("%s", &another);のために、それが正常に動作します。
これはなぜ起こりますか?何か案が?

+0

'num'を入力してEnterキーを押すと、ENTERのASCIIコードがscanfバッファに格納され、次の単一文字を読み込むたびに、ユーザ入力を待つことはなく、' ENTER' ASCIIコードが保存されます'another'変数に入れます。 –

答えて

1

この場合、scanf()の代わりにgetch()を使用してください。 scanf()は '\ n'を期待していますが、そのscanf()で1つの文字のみを受け入れているためです。混乱の原因となる次のscanf()に '\ n'が与えられます。

10

%c変換は、それが何であるかにかかわらず、入力から次の1文字を読み込みます。この場合、以前に%dを使用して番号を読み取っています。その数字の入力キーであるを打つ必要がありましたが、入力ストリームから改行を読み取るために何もしていません。したがって、%cの変換を実行すると、入力ストリームから新しい行を読み込みます(実際に何かを入力するのを待つことなく、すでに読み込み待ちの入力があるため)。

%sを使用すると、先頭の空白をスキップして空白以外の文字を取得します。これは改行を空白として扱うので、その待合改行を暗黙にスキップします。読んで待っている(おそらく)何もないので、明らかに望むように、何かを入力するのを待つことになります。

%cを変換に使用する場合は、フォーマット文字列の前に、ストリームの空白を飛び越すことができます。

+0

情報ありがとうございました –

+0

@ JessicaLingmn:確かに。 –

0
#include<stdio.h> 
void main() 
{ 
char another='y'; 
int num; 
while (another =='y') 
{ 
    printf("Enter a number:\t"); 
    scanf("%d", &num); 
    printf("Sqare of %d is : %d", num, num * num); 
    printf("\nWant to enter another number? y/n"); 
    getchar(); 
    scanf("%c", &another); 
} 
} 
2

Enterキーは、最初のscanf%dの番号を入力した後、stdinストリームにあります。このキーはscanf%c行でキャプチャされます。

scanf("%1s",char_array); another=char_array[0];を使用してください。

+1

-1 [未定義の動作](http://c-faq.com/stdio/stdinflush.html)を推奨します。 – Lundin

+0

私の悪い...答えを編集する。 – anishsane

関連する問題