如何从控制台模拟用户输入?
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编码的文件。
我正在 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编码的文件。