输入验证-数字与字母

Asked
Viewd5156

0

我正在创建一个简短的C#控制台程序,它将使用0-10之间的随机数询问10个附加问题。然后,它告诉用户他们有多少正确或不正确的答案。我试图找到一种方法来验证我的用户输入是数字而不是字母。我正在发布我到目前为止创建的代码,但是可以使用一些帮助。

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            int input;
            int correct = 0;
            int incorrect = 0;
            int questions = 10;
            int[] solutions = new int[21];
            int[] answers = new int[21];
            int[] number1 = new int[21];
            int[] number2 = new int[21]; 

            Random number = new Random();

            Console.WriteLine("  This is a test of your basic addition skills. ");
            Console.WriteLine("  Please answer the random addition question below ");
            Console.WriteLine("  with a number from 1 - 20 and press enter to get the");
            Console.WriteLine("  next of 10 questions.  At the end of the questions");
            Console.WriteLine("  your results will be calculated and presented to you.");
            Console.WriteLine("");
            Console.WriteLine("");

            while (i < questions)
            {
                number1[i] = number.Next(0, 10);
                number2[i] = number.Next(0,10);
                solutions[i] = (number1[i] + number2[i]);

                //Console.WriteLine("{0} +  {1} =  {2}", number1[i], number2[i],solutions[i]);  

                Console.Write("  {0} +  {1} =  ", number1[i], number2[i]);

                answers[i] = Convert.ToInt32(Console.ReadLine()); // original code      

                //input = Convert.ToInt32(Console.ReadLine());
                //if (input > 0 && input <21)
                //{
                //   Console.WriteLine("YOur answer is: {0}", input);
                //}
                //else
                //Console.WriteLine("YOur answer is not valid");

                if (solutions[i] == answers[i])
                {
                    Console.WriteLine("  Correct");
                    correct++;
                }
                else
                {
                    Console.WriteLine("  Your answer is incorrect, the correct answer is {0}", solutions[i]);
                    incorrect++;

                }
                //Console.WriteLine("{0}", answers[i]);

                //int sum = numberone + numbertwo;
                //answers[sum]++;
                i++;
            }

            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("The number correct is: {0}, The number incorrect is: {1}", correct, incorrect);
        }
    }
}
 
  • 我已经编辑了代码段,因此您可以立即用它替换ReadLine()部分。

    Wim HollebrandseNovember 13, 2009 20:49

5 个答案

0

这允许您填充数组的所有位置:

 int result;
bool isInt = Int32.TryParse(Console.ReadLine(), out result);
if (!isInt) {
  Console.WriteLine("Your input is not an integer number.");
  continue;
}

answers[i] = result;
 
  • Eric,只需在ReadLine周围放置一会儿(validNumber),并带有一个布尔标志“ validNumber”,如果有效,则将其设置为true,而在while循环外则设置为false。

    Wim HollebrandseNovember 13, 2009 20:42
  • 我还想提示用户重新输入数字

    EricNovember 13, 2009 20:36
3

代替:

 answers[i] = Convert.ToInt32(Console.ReadLine()); // original code
 

使用:

 int input;
bool validInput = int.TryParse(Console.ReadLine(), out input);
if (!validInput || input < 0 && input > 20)
    <throw exception or display some error message here...>
 

编辑::如果您要递归地请求正确的输入,可以通过以下方式进行:

 int input;
bool validInput = false;

while (!validInput)
{
    validInput = int.TryParse(Console.ReadLine(), out input);
    if (!validInput || input < 0 && input > 20)
    {
        validInput = false; // We need to set this again to false if the input is not between 0 & 20!
        Console.WriteLine("Please enter a number between 0 and 20");
    }
}
 
  • 使用您的解决方案,但是我还想提示用户重新输入有效答案,我应该使用while循环而不是if吗?我能做到吗?

    EricNovember 13, 2009 21:07
2
 int iResult = int.MinValue;
bool bParsed = int.TryParse("xyz", out iResult);
 

TryParse不会引发异常。

但是,如果需要,您也可以使用Convert.ToInt32(),但这会在错误数据上引发异常。

  • 无需初始化iResult,因为它是out参数。

    Philip WallaceNovember 13, 2009 20:31
1

类似的东西:

 if (int.TryParse(Console.ReadLine(), out answers[i]) && answers[i] > 0 && ...)
{ 
    ...
}
else
{
   // invalid answer
}
 
14

像这样使用int.TryParse():

 bool isNumber=false;
int number;
while (!isNumber)
{
  string txt = Console.ReadLine();
  if (!int.TryParse(txt, out number))
  {
    // not a number, handle it
    Console.WriteLine("This is not a number, enter a number. For real now.");
  }
  else
  {
    // use number
    answers[i] = number;
    isNumber = true;
  }
}
 
  • 需要一个out参数-无法编译 并且int号只能从else范围内访问

    PostManNovember 13, 2009 20:35
  • 好而直接,没有多余的异常

    curtiskNovember 13, 2009 20:32
  • 为什么不只使用Int32.TryParse(String,Int32)而不是两次?

    Philip WallaceNovember 13, 2009 20:33
  • 它在答案数组中只是空白位置

    eKek0November 13, 2009 20:35