在控制台应用程序中输入的不同模式

时间:2015-05-09 08:46:02

标签: c# visual-studio-2010

我是.net的初学者,我做了一个简单的控制台应用程序,它的工作原理。我的问题是,当我输入输入时,输入必须在新行中 例如:

1
2
3

我如何输入

1 2
3   

我正在使用以下代码

int a, b, c,d;
            Console.WriteLine("Enter the numbers:");
            a = Convert.ToInt32(Console.ReadLine());
            b = Convert.ToInt32(Console.ReadLine());
            c = Convert.ToInt32(Console.ReadLine());
            d = a + b + c;
            Console.WriteLine("Sum:" + d);

3 个答案:

答案 0 :(得分:0)

一种选择是接受单行输入作为字符串然后处理它。例如:

//Read line, and split it by whitespace into an array of strings
//1 2    
string[] tokens = Console.ReadLine().Split();
//Parse element 0
int a = int.Parse(tokens[0]);

//Parse element 1
int b = int.Parse(tokens[1]);

这种方法的一个问题是,如果用户没有以预期格式输入文本,它将失败(通过抛出IndexOutOfRangeException/ FormatException)。如果可以,则必须验证输入。

例如,使用regular expressions

string line = Console.ReadLine();

// If the line consists of a sequence of digits, followed by whitespaces,
// followed by another sequence of digits (doesn't handle overflows)
if(new Regex(@"^\d+\s+\d+$").IsMatch(line))
{
   ...   // Valid: process input
}
else
{
   ...   // Invalid input
}

可替换地:

验证输入分成2个字符串。 使用int。TryParse尝试将字符串解析为数字。

这是一个例子:

 class Program
    {
        private static void Main(string[] args)
        {
            int a = 0,
            b = 0;
            Console.WriteLine("Enter the numbers:");
            var readLine = Console.ReadLine();
            if (readLine != null)
            {
                // If the line consists of a sequence of digits, followed by whitespaces,
                // followed by another sequence of digits (doesn't handle overflows)
                if (new Regex(@"^\d+\s+\d+$").IsMatch(readLine))
                {
                    string[] tokens = readLine.Split();
                    //Parse element 0
                    a = int.Parse(tokens[0]);

                    //Parse element 1
                    b = int.Parse(tokens[1]);
                }
                else
                {
                    Console.WriteLine("Please enter numbers");
                }
            }
            var c = Convert.ToInt32(Console.ReadLine());
            var d = a + b + c;
            Console.WriteLine("Sum:" + d);
        }
    }

答案 1 :(得分:0)

编写输入解析器... ReadLine,按空格字符拆分结果字符串,并将每个段提供给int转换器并求它们。

下面给出的示例利用Linq,它有点功能,允许链接由分割产生的令牌数组,并对其每个元素执行操作。即Select(...)基本上是一个map函数,它将Convert.ToInt32应用于令牌数组中的每个元素,然后将其传递到到目前为止记忆结果的Aggregate函数中(从0开始并继续添加现在转换的int标记数组中的下一个元素...由s + t表示,其中s是当前的memoized种子,t是迭代中的当前标记。)

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var str = Console.ReadLine();
        var tokens = str.Split(' ');
        var result = tokens.Select(t => Convert.ToInt32(t)).Aggregate(0, (s, t) => s + t);
        Console.WriteLine(result);
    }
}

为了完整起见......第二个版本应该更能抵抗错误:

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Enter 1 or more numbers separated by space in between. I.e. 1 2\nAny non numerical will be treated as 0:");
        var str = Console.ReadLine();
        if (string.IsNullOrWhiteSpace(str))
        {
            Console.WriteLine("Sorry, expecting 1 or more numbers separated by space in betwen. I.e. 5 6 8 9");
        }
        else
        {
            var tokens = str.Split(' ');
            var result = tokens
                .Select(t =>
                {
                    int i;
                    if (int.TryParse(t, out i))
                    {
                        Console.WriteLine("Valid Number Detected: {0}", i);
                    };
                    return i;
                })
                .Aggregate(0, (s, t) => s + t);
            Console.WriteLine("Sum of all numbers is {0}", result);
        }

        Console.ReadLine();
    }
}

答案 2 :(得分:0)

您正在使用Console.ReadLine()读取整行。

文档:

  

一行定义为字符序列,后跟回车符(十六进制0x000d),换行符(十六进制0x000a)或Environment.NewLine属性的值。返回的字符串不包含终止字符。

您可以读取整行然后处理它,例如使用String.Split方法。