6

私はまだ高級プログラミング言語のプログラミングの初心者なので、これが簡単な解決策かどうかはわかりませんが、とにかく学べてうれしいです。私は C# で小さなアラーム プログラムをプログラムしました。これにより、アラームを鳴らす必要がある秒数をユーザーに入力させることができます。完全に機能しますが、ユーザーが入力する必要があるのは数値でなければなりません。ユーザーが任意の形式のテキストを入力すると、プログラムがクラッシュします。では、プログラムがクラッシュするだけでなく、ユーザーがテキストを入力したり、関数を呼び出したり、何か他のことをしたりするのを防ぐにはどうすればよいでしょうか?

これは私が今持っているコードです:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test
{
    class Alarm
    {
        public static void play()
        {
            int sec;
            sec = Convert.ToInt16(Console.ReadLine());

            for (int i = 0; i < seconds; ++i)
            {
                System.Threading.Thread.Sleep(1000);
            }

            for (int i = 0; i < 10; i++)
            {
                Console.Beep();
            }
        }
    }
}
4

8 に答える 8

11

変換する前にチェックを完了する必要があります。

int sec;

if (int.TryParse(Console.ReadLine(), out sec)
{
  // this is valid continue
}
else
{
  // show error highlighting that entry must be a number
}

int.TryParse入力がintに解析可能かどうかを強調するブール値を返します。またsec、成功した場合は変数を値に設定します。

于 2012-06-27T13:16:36.967 に答える
7

ユーザーが数値を入力するまで、無限にループする可能性があります。

int number = 0;
while(!Int32.TryParse(Console.ReadLine(), out number))
{
    Console.WriteLine("Please input a number.");
}

Int32.TryParsefalse変換が失敗した場合は例外をスローする代わりにを返し、成功した場合は2番目のパラメーターの結果を返しますout

于 2012-06-27T13:18:00.153 に答える
1

tryparseメソッドを使用する必要があります。

このようなもの:

  int number;
  bool result = Int32.TryParse(Console.ReadLine(), out number);

結果がtrueの場合、正常に解析されています。つまり、整数です。そうでない場合は失敗しています。つまり、整数ではありません。

次に、int32として解析された値としてnumberを使用できます。

于 2012-06-27T13:16:30.850 に答える
1

すでに人々はここで答えました。extension method私はそれを非常に多くの場所で呼び出すことができるようにするのが大好きです.

public static bool IsNumeric(this string theValue)
{
  long retNum;
  return long.TryParse(theValue, System.Globalization.NumberStyles.Integer, 
            System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);
}

それから私はそれをこのように呼びます

if(Console.ReadLine().IsNumeric())
{
    //The value is numeric. You can use it    
}
于 2012-06-27T13:21:22.567 に答える
0

交換

sec = Convert.ToInt16(Console.ReadLine());

try {
    sec = Convert.ToInt16(Console.ReadLine());
}

catch(Exception e ){
    Console.Writeline(" Enter numbers only");
}
于 2012-06-27T13:17:48.880 に答える
0

あなたがやろうとしていることは、しばしばInput Validationと呼ばれます。あなたの場合、解析する前に数字を入力したことを確認する必要があります。Int16 には、役立つTryParse関数があります。

于 2012-06-27T13:18:35.127 に答える
0

無効な文字列を整数に変換しようとしたときに発生するエラーをキャッチするために、try ステートメントを使用する別の関数を追加します。

int readInput()
{
    int sec;
    while(true)
    {
        try
        {
            sec = Convert.ToInt16(Console.ReadLine());
            return sec;
        }
        catch(Exception e) 
                    { 
                            Console.WriteLine("Enter an integer!");
                    }
    }
    return 0;
}
于 2012-06-27T13:23:45.967 に答える
0

エラー メッセージを表示してユーザーにデータの再入力を求めるよりも洗練された処理を行いたい場合は、 Console.Readkey()で発生する各キーストロークを処理し、そうでない文字列になる場合はそれらを拒否することができます。数字です。

私は数年前にTurboPascalでこのようなことをしました。

これはメモリから記述された疑似コードですが、正しいパスにたどり着くはずです。浮動小数点値と整数、または負数と正数の両方を取得する必要がある場合は、これらのケースを処理するためのロジックを追加する必要があります。

string enteredText = "";
char key;
bool done = false;
while (!done) 
{
   key = Console.ReadKey();
   if (key is number)
       enteredText += key;
   else if (key is backspace)
   {
       //remove the last char from enteredText.  Handle case where enteredText has length 0
       Console.Write(backspace); 
   }
   else if ((key is enter) && (enteredText.Length > 0))
       done = true;
   else
   {
       // invalid char.
       //MSDN says the char is echoed to the console so remove it
       Console.Write(backspace);
       //Beep at the user?
   }
}
于 2012-06-27T15:29:09.187 に答える