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.TryParse如果转换失败则返回false,而不是抛出异常,如果成功则在第二个out参数中返回结果。

于 2012-06-27T13:18:00.153 回答
1

您应该使用尝试解析方法。

像这样的东西:

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

如果结果为真,那么它已经成功解析它,这意味着它是一个整数。如果不是,它就失败了,这意味着它不是整数。

然后,您可以使用 number 作为解析为 int32 的值。

于 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 回答