0

私は私を混乱させる小さなプログラムを持っています。ループを使用してユーザーからの入力を取得しようとしています。入力が間違っている場合は再度繰り返されますが、正しい場合は終了します。コードスニペットは次のとおりです。

void main()
{
    char user_status; // Checks User Status q = Quiz Master and p = Participant
    int valid_status = '0'; // Checks If User Status Is Valid Or Not. Used In Some Loops. 0 = Invalid, 1 = Invalid.
    printf("Welcome to General Knowledge Quiz Management System.\nThis application has been designed to help you conduct a quiz or test your GK.");
    do
    {
        user_status = '0';
        printf("\n\nPlease enter your role.\nQuiz Master = \'q\'\nParticipant = \'p\'\n");
        scanf("%c", &user_status);
        if (user_status == 'q'|| user_status == 'Q')
        {
            printf("Initializing Quiz Master Segment\n\n________________________________\n");
            initiate_qm();
            valid_status = '1';
        }
        else if (user_status == 'p' || user_status == 'P')
        {
            printf("Initializing Participant Segment");
            initiate_pa();
            valid_status = '1';
        }
    }
    while (valid_status != '1')
        printf("\nProgram Will Exit Now. Press Any Key To Return To Windows.");
    getch();
}

私はこの出力を期待しています:

Please Enter Your Role 
Quiz Master = 'q' 
Participant = 'p'

今まで、それはうまくいきます。q / Q / p / Pを入力すると、うまく機能します。しかし、何か間違ったものを入力すると、必要な出力が得られません。

たとえば、「abc」と入力すると、qまたはpを入力するように求める上記のテキストが再度表示されます。しかし、代わりに、私はこれを取得します:

 Please Enter Your Role 
 Quiz Master = 'q' 
 Participant = 'p' 
 Please Enter Your Role 
 Quiz Master = 'q' 
 Participant = 'p'
 Please Enter Your Role 
 Quiz Master = 'q' 
 Participant = 'p'
 Please Enter Your Role 
 Quiz Master = 'q' 
 Participant = 'p'
 _ (I have to input here)

さて、なぜそれは余分に3回繰り返されるのですか。注意すべき興味深い点の1つは、2文字の長さの文字を入力すると、2回余分に繰り返され、空白のままにすると(returnキーを押すだけ)、余分な回数は繰り返されないことです。

Cのみを使用する必要があります。コンパイルにはVisualC++2010を使用しています。

ありがとう。

4

3 に答える 3

4

scanf に処理する文字を 3 つ指定したためです。初めて scanf を呼び出して「a」を取得するときに最初の最初の文字を削除しますが、stdin バッファーにはまだ「bc」が残っています。

入力を再度探す前に、バッファ内に残っているものを確認する必要があります。また、標準入力バッファーのフラッシュは未定義の動作であるため、避けたいと思います。(http://www.gidnetwork.com/b-57.html)

残りの文字を読み取って破棄することができます

do{  
    scanf("%c", &user_status);  
}while(user_status!='\n'); //This discards all characters until you get to a newline

必要な文字を読んだ直後。

于 2011-03-07T06:01:51.353 に答える
1

あなたが欲しい

do
{

} while (condition);

セミコロンを忘れると、次のようになります。

do
{
    ....
}

while(condition)
    do something else;

質問に対して行ったように、エディターでコードを自動インデントするだけで気付くかもしれません。

また、いくつかを行うときは、フォーマット仕様にをscanf含める必要があります。\n

于 2011-03-07T05:59:02.713 に答える
0

まず、キャラクターを取得するために# include <stdio.h>使用します。getc(stdin)カーソルが移動したり、不要な文字がコンソールに表示されたりするのを防ぐのに役立ちます。次に、ループの前にウェルカムメッセージを書き込みます。

于 2011-03-07T06:15:30.030 に答える