我有一个C#控制台程序,该程序通过显示输入提示来询问用户某个单词。然后使用switch语句处理输入。如果单词正确,程序将继续。但是,如果输入不匹配,程序将显示“错误:输入无效”,然后返回到输入提示。棘手的部分是,我希望程序在按Enter之前清除用户刚刚输入的输入并再次提示用户,而不必在第一个提示下方另外输入提示。
在C#中是否存在某种类似的库,或者是否需要为其创建库?
答案 0 :(得分:1)
执行此操作的一种方法是使用val()
和Console.SetCursorPosition
的组合来将光标设置为响应的开头,写入足够的空格以“擦除”其响应,然后设置再次回到起点。
例如:
Console.Write
在使用中,它可能类似于:
static string GetUserInput(string prompt, List<string> validResponses)
{
Console.Write(prompt);
// Capture the cursor position just after the prompt
var inputCursorLeft = Console.CursorLeft;
var inputCursorTop = Console.CursorTop;
// Now get user input
string input = Console.ReadLine();
while (validResponses != null &&
validResponses.Any() &&
!validResponses.Contains(input, StringComparer.OrdinalIgnoreCase))
{
Console.ForegroundColor = ConsoleColor.Red;
// PadRight ensures that this line extends the width
// of the console window so it erases itself each time
Console.Write($"Error! '{input}' is not a valid response".PadRight(Console.WindowWidth));
Console.ResetColor();
// Set cursor position to just after the promt again, write
// a blank line, and reset the cursor one more time
Console.SetCursorPosition(inputCursorLeft, inputCursorTop);
Console.Write(new string(' ', input.Length));
Console.SetCursorPosition(inputCursorLeft, inputCursorTop);
input = Console.ReadLine();
}
// Erase the last error message (if there was one)
Console.Write(new string(' ', Console.WindowWidth));
return input;
}
这是该程序的示例运行。由于每次迭代都会清除响应(然后是错误消息),因此我必须包括几个屏幕截图:
答案 1 :(得分:0)
尝试一下...
static void Main(string[] args)
{
CheckWord();
Console.ReadKey();
}
private static void CheckWord()
{
while (true)
{
string errorMessage = "Error: invalid input ... enter a valid entry";
string word = Console.ReadLine();
if (word != "word")
{
Console.SetCursorPosition(word.Length +1 , (Console.CursorTop) - 1);
Console.Write(errorMessage);
Console.ReadKey();
Console.SetCursorPosition(0, Console.CursorTop);
for (int i = 0; i <= word.Length + errorMessage.Length +1 ; i++)
{
Console.Write(" ");
}
Console.SetCursorPosition(0, Console.CursorTop);
}
else
{
break;
}
}
}