2012-03-16 7 views
0

何らかの理由でwhileループが2回実行され、入力を求めるプロンプトが表示される前に文字列が2回出力されます。私は入力バッファに文字が入っていると仮定していましたが、それは私には分かりません。何かアドバイス?whileループはprintfを2回生成してから入力を要求しますか?

while (count >= 0 && stop != 83 && isClosed == 0) { 
    printf("Percentage of Door Closed: %d\n",count); 
    count -= 10; 
    printf("If sensor detects object press 'S'\n"); 
    printf("Press any button to continue closing door\n"); 
    stop = getchar(); 
    if (count == 0) { 
     isClosed=1; 
    } 
} 

出力:

Percentage of Door Closed: 100 
If sensor detects object press 'S' 
Press any button to continue closing door 
Percentage of Door Closed: 90 
If sensor detects object press 'S' 
Press any button to continue closing door 
a 
Percentage of Door Closed: 80 
If sensor detects object press 'S' 
Press any button to continue closing door 
Percentage of Door Closed: 70 
If sensor detects object press 'S' 
Press any button to continue closing door 
S 
+1

一文字を入力してEnterキーを押すと、入力した文字と打鍵からの「\ n」文字の2つの文字が 'stdin'に入ります。 –

+0

stop = nullを実行しますか? whileループが発生するのを防ぐ前に?私はそれを試みたが、それでもまだ2回実行する。 –

+0

いいえ、あなたは '\ n'を消費して無視しなければなりません。すべての改行文字をスキップするにはwhile((stop = getchar())== '\ n'); 'を実行します(ループはループし、 '\ n'でなければ次の文字に' stop'を設定します) 、またはあなたは、下のperrealやjohn bodeが言ったことをすることができます。 –

答えて

1

S <Enter>と入力すると、入力ストリームに送信される改行文字が取得されます。

while ((stop = getchar()) == '\n'); // loops until it reads a non-newline 
            // character 

または

scanf(" %c", &stop); // note leading blank in format string; this tells scanf 
        // to skip any leading whitespace characters. 
+0

scanf( "%c \ n"、&stop)の場合、ASCIIで83文字の 'S'を押すと、プログラムは終了しないようです。どんな考え?最初に何かが入った後、ストップは1に設定されているようです。 –

+0

@Mullerこの場合、 'stop'は' char'型であることを確認してください。さらに、文字リテラル「S」は、ASCIIを使用するシステムでは83という値を持ちます。 – fuz

0

はあなたには、いくつかのキーがいくつかの文字を生成する可能性があるため、バッファがいっぱいにキーを使用してプログラムを開始しているということでした。 stop = getchar()にブレークポイントを設定して、ループの最初の反復で上に戻るときにstopの値を監視します。

0

私は私の文字を取得するためにgetcharを使用して、代わりにscanf("%c", &stop)を使用していなかったので、私は、今日同様の問題があった:あなたはこれでいくつかの方法を扱うことができます。文字列検索のために%c%sに変更すると、問題は解決されました。

私はそれが同じことをすると思いますので、getStringが問題を解決する可能性があります。

+0

編集ありがとう – DarkAir

関連する問題