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

How can I simulate user input from a 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);
    }
}

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

有没有办法使用文本框,只需要在文本框中 copy/paste 并使用 streamReader 或类似的东西从文本框中读取?

您可以使用 StringReader class 从 string 而不是文件中读取。

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

我是这样解决的:

.

.

只需将此 class 粘贴到静态 Main 方法上方或主要 class 内的任何位置以隐藏原始 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)

只需设置应用程序参数:

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

注意保存为ANSI编码的文件。