2017-01-16 14 views
0

私はゲームHammurabiを作成しています(私のuniの割り当てだけです)。ユーザーにテキストを入力しているかどうかをチェックして、テキストを入力します。私は彼に欲しい数字をユーザに入力させる方法を知っているが、彼が "a"のようなものを入力してプログラムをバグすると、それを修正する方法がわからない。ここでユーザーがテキストを入力するのをブロックする方法

は私が話しているかの例です:

while (acresToBuy < 0) 
{ 
    Console.WriteLine("Please type a positive number or 0"); 
    acresToBuy = int.Parse(Console.ReadLine()); 
} 

int cost = trade * acresToBuy; 
while (cost > bushels) 
{ 
    Console.WriteLine("We have but " + bushels + " bushels of grain, not " + cost); 
    acresToBuy = int.Parse(Console.ReadLine()); 
    cost = trade * acresToBuy; 
} 
+0

コードをエラーにしたくない場合は、try/catchブロックを使用してください。適切な数値が得られるまで入力を求める必要がある場合は、入力をintに変換可能かどうかをチェックするループで行い、そうでない場合は数値の要求を繰り返します。 – Edward

+0

これを参考にしてください:http://stackoverflow.com/questions/4804968/how-can-i-validate-console-input-as-integers @Hans Passantの答え。ポイントは、ReadLine()の代わりにReadKey()を使用することで、1文字入力中にキーを検証できます。 – kurakura88

+0

構文解析の代わりにtry parseを使用してください。 tryparseがfalseを返した場合、intを入力せずにもう一度問い合わせてください –

答えて

0

あなたは絶対に入力が解析可能であることを保証することができ、そしてそれはでない限りあなたはint.Parse(または他の種類の同等物)を使用しないでくださいユーザーの入力が関係するところではできないことです。

do 
{ 
    Console.WriteLine("Please type a positive number or 0"); 

    int input; 
    if (int.TryParse(Console.ReadLine(), out input) 
     && input >= 0) // You can validate the input at the same time 
    { 
     acresToBuy = input; 
    } 
    else 
    { 
     Console.WriteLine("That was not the correct input. Please try again."); 
     acresToBuy = -1; 
    } 
} while (acresToBuy < 0); 

編集:whileループは常にそれが実行する前に、第一条件です確認し、そうacresToBuyが未満何かの初期値を持っている場合、あなたのコードにのみ実行されることを心に留めておくだろう代わりに、あなたはint.TryParseを使用する必要があります0(すなわち、-1)。これを既存の条件と常に比較する必要がないようにするには、代わりにdo-whileループを使用する必要があります。ループは常に1回以上実行されます。

+0

これは、whileループの中にあるものの、ユーザーが0より小さい値を入力した場合にのみ機能します。一度にすべてをチェックしたい。 編集:私はそのコードだけを投稿しました。申し訳ありません、私の悪い。 – SadonEmsi

+0

@SadonEmsi 'acresToBuy'は0より小さい(つまり-1)初期値で始まると仮定していますが、' while'ループは想定していることをやっています。公正では、 'while'ループを' do-while'ループに置き換えて、ロジックが既存の条件によって干渉されないようにしてください。 – Abion47

+0

さて、私は理解していますが、out関数は正確に何をしていますか?それは入力変数に値を返しますか? – SadonEmsi

1

これにはInt.TryParseを使用できます。たとえば:Int.TryParseが失敗した場合

while (acresToBuy < 0) 
{ 
    Console.WriteLine("Please type a positive number or 0"); 
    acresToBuy = int.TryParse(Console.ReadLine(), out acresToBuy) ? acresToBuy : -1; 
} 

、その方法は、それが成功した場合、我々は単に戻って自分自身にそれを割り当て、その後、私たちは割り当てている-1 acresToBuyに、そうでない場合は、falseを返します。

+0

'acresToBuy <0'に値がない場合、それをチェックすることはできません。値があれば' out'パラメータとして使用することはできません。 – Abion47

関連する問題