2012-03-05 4 views
0

C、unix、とiのアプリケーションを書くことは、入力が有効になるまでユーザーの入力を要求する関数を持っています。 - HループはC言語で期待以上に実行されます

int inputX() 
{ 
    int result; 
    char input; 
    while(1) 
    { 
     printf("Input x (a, b, c, d, e, f, g, h) :"); 
     scanf("%c", &input); 
     result = validChar(input); 
     if (result >= 0) 
     { 
      return result; 
     } 
     else 
     { 
      printf("Invlid input. Lets try again.\n"); 
     } 
    } 
} 

validChar()チェックが入力された場合: は直進します。 私がaを入力した場合 - すべて正常です。 iを入力した場合1、出力は

Input x (a, b, c, d, e, f, g, h) :1 
Invlid input. Lets try again. 
Input x (a, b, c, d, e, f, g, h) :Invlid input. Lets try again. 
Input x (a, b, c, d, e, f, g, h) : 

私も試してみました睡眠()ですが、didntの仕事は... Cはトリッキーです:|

+1

この質問に「C++」というタグが付いているのはなぜですか? –

+1

入力バッファにデータが残っていると思われます。 2回目の繰り返しで 'input'の内容を調べましたか?それはあなたに多くを教えてあげます... –

+1

[C loop prints string twice? (scanf( "%c")を使用して)](http://stackoverflow.com/questions/9421926/c-loop-prints-string-twice-using-scanfc) –

答えて

4

使用バッファに残された空白を取り除くために、このチープ・トリック:それは任意の文字を食べる%c

scanfを使用して
scanf(" %c", &input); 
    ^
+0

魅力的な作品です!誰も私にそれを教えてくれないと、私はそれを理解できない。ありがとう:) – Wish

+0

ええ、これは私がもっと教えられたことを望んでいるものの一つです。 '%d'、'%i'、 '%o'、'%x'、 '%s'、'%f'などの他の変換指定子の大部分(すべて?)とは異なり、 '%c'変換指定子は先頭の空白をスキップするように 'scanf 'に指示しません。これは完璧に論理的です。時には空白文字を読みたい場合もありますが、実行したような問題を引き起こす可能性があるからです。同じ効果を得るには、上記のトリックを '%c'の前に空白で使用する必要があります。 –

0

を行います。 2回目の実行はおそらくあなたが入力した改行です。

0

最初のコールは1をピックアップします。 2回目の呼び出しでは\nが返されます。行全体を読んでそれを解析してください。

関連する問題