将输入限制为a,b或d

时间:2014-07-27 10:28:16

标签: c# try-catch

我正在创建一个多项选择测验应用程序,我正在尝试创建验证。用户必须选择的选项是a,b,c或d,我需要使用try和catch限制这些选项的输入。问题是这些变量类型是字符串,必须是字符串。问题是程序正在接受任何字符串(应该如此)。但有没有办法将它限制在这四个选择之中?我试图强迫程序去抓住,如果字母没有== a,b,c或d但没有快乐。

string[] QuestNums;
        string[] QuestLevel;
        string[] Quest;
        string[] QuestAns;

        QuestNums = new string[50];
        QuestLevel = new string[50];
        Quest = new string[50];
        QuestAns = new string[50];
 while (level == "1")
            {


                Console.Clear();


                Random rnd = new Random();
                int level1_rand = rnd.Next(0, 9);
                AmountAsked++;
            begin:
                try
                {

                    Console.WriteLine("\n\nLevel: 1 \t Score: {0} \tMaximum Questions Remaining: {1} ", score, 20 - AmountAsked);
                    Console.WriteLine("\n\n{0}", wrong);
                    Console.WriteLine("\n\n{0}", Quest[level1_rand]);
                    Console.Write("\nAnswer: ");
                    string selection = Console.ReadLine();
                    string decider = QuestAns[level1_rand];

                    if (selection == decider)
                    {

                        level = "2";
                        score = score + 1;
                        if (score >= 50)
                        {
                            Passed();
                        }
                    }

                    if (selection != decider)
                    {
                        fail = fail - 1;
                        wrong = wrong + 1;
                    }

                    if (selection != decider && AmountAsked > 19 || selection == decider && AmountAsked > 19 || fail == 0)
                    {
                        Failed();
                    }
                }
                catch
                {
                    Console.Clear();
                    Console.WriteLine("Invalid input, press any key to try agiain");
                    Console.ReadLine();
                    goto begin;
                }

                }

2 个答案:

答案 0 :(得分:2)

尝试以下算法

bool inputIsValid=false;
do
{
   var input=ReadInput();

   inputIsValid=ValidateInput(input);
}
while(inputIsValid==false);

*或者像理查德建议用更少的行

    string input = null;
    do{
        input = ReadInput();
    } while (!ValidateInput(input));

ValidateInput()可以使用try / catch块或其他东西。 如果它无效或必须为真,则必须返回false

类似这样的事情

string ReadInput()
{
  return Console.ReadLine();

}

bool ValidateInput(string inputString)
{
     return inputString=="a" || inputString=="b" || inputString=="c" || inputString=="d" ;
}

答案 1 :(得分:2)

您不应使用异常(即try / catch块)来验证用户输入。实例化和抛出异常并不是很便宜,它们应该用于异常,意外情况(即无法连接到数据库,无法将文件保存到磁盘)。

用户输入通常不被视为特殊的意外情况 - 用户经常会弄错。

相反,您可以只有一个有效输入列表,并检查用户的输入是否是列表的一部分。

using System.Linq;

static void Main()
{
    var validInputs = new List<string> {"a", "b", "c", "d"};

    string input = Console.ReadLine();

    //validate and retry
    while(! validInputs.Contains(input))
    {
        Console.WriteLine("Input was not valid. Please try again.");
        input = Console.ReadLine();
    }

    //do something here with the valid input
}