0

これは、printf()とputchar()をインターリーブできるというK&Rのステートメントです。それが本当なら、なぜ次のコードが必要な出力を与えないのですか:-

#include"stdio.h"
void main()
{
    char c,d;
    printf("Enter the first character\n");
    scanf("%c",&c);
    printf("%c\n",c);
    printf("Enter the second character\n");
    d=getchar();
    putchar(d);
    printf("\n");
}

このプログラムを実行しているときはいつでも、出力は次のようになります。

最初の文字を入力してください
a
a
2番目の文字を入力してください


これが出力です。これは、printf()をputchar()に置き換え、scanf()をgetchar()に置き換えた場合にも発生します。なぜこれが起こっているのですか?

4

4 に答える 4

5

最初のものはプレスの結果をscanf入力バッファに残すので、2番目のものはユーザーから別の文字を取得する代わりにこれを取得します。\nReturngetchar()\n

その改行文字をスキップしたい場合は、scanfそれを「食べる」ように指示することができます。

scanf("%c\n",&c);

または、次の呼び出しを使用して直接「食べる」getchar()

scanf("%c",&c);
getchar();

(2番目のスニペットはバッファにある文字をすべて食べるのに対し、最初のスニペットはそれがである場合にのみそれを削除するため、これらは完全に同等ではないことに注意してください\n

于 2012-12-29T16:16:37.810 に答える
0

コンソールにエコーされる1つを入力し、それを印刷するため、2つのaが取得されます。

于 2012-12-29T16:16:23.143 に答える
-2

を使用する前にstdinをフラッシュしgetchar(ます。

ターボでは、fflush()..を使用します。

gccでは、__fpurge(stdin)..を使用します(これは<stdio_ext.h>ヘッダーで利用可能です)。

何かをスキャンする前に標準入力をフラッシュすると、問題が解決します。

于 2012-12-29T16:16:17.857 に答える