0

gcc を使用して Linux にコンパイルする場合、ユーザーが何らかの回答を入力するたびに、プログラムは別の反復でコードの同じ部分に到達しますが、ユーザーの入力を待たず、代わりに scanf 関数に改行をフィードします。 program print 'わかりません!' 毎回...プログラムは動作しますが、それでも、ユーザーの回答とは関係なく、「わかりません!」と書きたくありませんでした。これがコードの特定の部分です。

do
{
    printf("\n\nAnswer: (y/n) ");
    scanf("%c", &ans);
    //printf("\n->%c<-\n", ans); //just for debugging
    if (ans == 'y')
    {
        age += v[0];
    }
    else if (ans != 'n')
    {
        printf("\nI don't get it!\n");
    }
} while (ans != 'y' && ans != 'n');

これらは宣言です:
char v[64];
char ans;

(この do..while ループは 'for' 内にあります) さらに困惑するのは、プログラムが Windows で期待どおりにコンパイルおよび実行されるという事実です... (MinGW を使用) fflush(stdin を使用してみました) scanf の前および/または後ですが、役に立ちませんでした。重要な観察は、最初にこの質問に到達したときに期待どおりに動作することです。

(ユーザーが答える前に)
回答: (y/n)
わかりません! // これは毎回書き込まれますが、最初の

答え: (y/n) n

あなたは21歳です!

ユーザーが無効な入力を書き込んだ場合:

答え: (y/n) w

理解できません!

回答: (y/n) // この行と次の行は印刷されるべきではあり
ません。わかりません!

回答: (y/n)
//(現在はユーザー入力を待機しています)

何か案は?

編集

修正しました:(追加で宣言しましたchar buf[50]

do
{
    printf("\n\nAnswer: (y/n) ");
    fgets(buf, 50, stdin);
    sscanf(buf, " %c", &ans);
    if (ans == 'y')
    {
        age += v[0];
    }
    else if (ans != 'n')
    {
        printf("\nI don't get it!\n");
    }
} while (ans != 'y' && ans != 'n');

誰かがscanfの問題を教えてもらえますか?

4

2 に答える 2

0

について@Florisの回答に従ってくださいfgets()


を使用する必要がある場合はscanf()

scanf(" %c", &ans);

前のスペースは、前の行のまたは"%c"を含むすべての先頭の空白を消費します。Enter'\n'

次のスペースを追加したくないのは確かですscanf()。別の非空白が入力されるまですべての空白を消費するからです。stdinは通常バッファリングされるため、行を に渡すために必要な非空白の後に追加することを意味 し'\n'ますscanf()

于 2014-02-13T00:18:14.927 に答える