如何从控制台模拟用户输入?

时间:2017-03-10 21:01:35

标签: c# streamreader windows-console

我在HackerRank中做了一些挑战。我通常在visualstudio中使用windows Form项目来进行调试,但意识到我输入测试用例时输了很多时间。所以我想建议一种我可以轻松模拟console.ReadLine()

的方法

通常情况下的挑战都是这样描述的:

5
1 2 1 3 2 
3 2

然后读取如下:使用三个ReadLine

static void Main(String[] args) {
    int n = Convert.ToInt32(Console.ReadLine());
    string[] squares_temp = Console.ReadLine().Split(' ');
    int[] squares = Array.ConvertAll(squares_temp,Int32.Parse);
    string[] tokens_d = Console.ReadLine().Split(' ');
    int d = Convert.ToInt32(tokens_d[0]);
    int m = Convert.ToInt32(tokens_d[1]);
    // your code goes here
}

现在我正在考虑创建一个文件testCase.txt并使用StreamReader。

using (StreamReader sr = new StreamReader("testCase.txt")) 
{
    string line;
    // Read and display lines from the file until the end of 
    // the file is reached.
    while ((line = sr.ReadLine()) != null) 
    {
        Console.WriteLine(line);
    }
}

这样我可以用Console.ReadLine()替换sr.ReadLine(),但这需要打开文本编辑器,删除旧案例,复制新案例并每次保存文件。

那么有没有办法可以使用文本框,所以只需要在文本框中复制/粘贴并使用streamReader或类似的东西从文本框中读取?

3 个答案:

答案 0 :(得分:1)

您可以使用StringReader类来读取string而不是文件。

答案 1 :(得分:0)

您接受的解决方案!并没有真正模拟Console.ReadLine(),因此您不能将其直接粘贴到 HackerRank

我这样解决了:

只需将此类粘贴到静态Main方法上方或在主类内部的任何位置即可隐藏原始的 System.Console

        class Console
        {
            public static Queue<string> TestData = new Queue<string>();
            public static void SetTestData(string testData)
            {
                TestData = new Queue<string>(testData.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Select(x=>x.TrimStart()));
            }
            public static void SetTestDataFromFile(string path)
            {
                TestData = new Queue<string>(File.ReadAllLines(path));
            }
            public static string ReadLine()
            {
                return TestData.Dequeue();
            }
            public static void WriteLine(object value = null)
            {
                System.Console.WriteLine(value);
            }
            public static void Write(object value = null)
            {
                System.Console.WriteLine(value);
            }
        }

并以这种方式使用它。

    //Paste the Console class here.
    static void HackersRankProblem(String[] args)
    {
        Console.SetTestData(@"
            6
            6 12 8 10 20 16
        ");


        int n = int.Parse(Console.ReadLine());
        string arrStr = Console.ReadLine();
        .
        .
        .
    }

现在您的代码将看起来一样!而且您可以在不更改代码的情况下测试任意数量的数据。

注意:如果您需要更多复杂的Write或WriteLine方法,只需添加它们并将其发送到原始System.Console(.. args)

答案 2 :(得分:-1)

只需设置应用程序参数:

并在 input.txt 中提供您的输入文本。

小心使用 ANSI 编码保存文件。