当输入的类型不是整数时,程序应失败。但是,有两个问题:
当输入错误的数字时,如何使它停留在同一行并仅清除屏幕上的先前输入(并允许从同一位置重试)?
static void Main(string[] args)
{
int firstNum;
int Operation = 1;
switch (Operation)
{
case 1:
Console.SetCursorPosition(0, 0);
Console.Write("Write a number: ");
firstNum = ReadInteger("");
Console.ReadKey();
break;
}
}
private static int ReadInteger(string title)
{
while (true)
{
if (!string.IsNullOrWhiteSpace(title))
Console.WriteLine(title);
string input = Console.ReadLine();
if (int.TryParse(input, out int result))
return result;
Console.WriteLine("Sorry, not a valid integer value; please, try again.");
Console.ReadKey();
}
}
答案 0 :(得分:2)
广告1)
因为在Console.ReadKey
的末尾有ReadInteger
,这也将被执行。因此,如果您在Console.ReadLine
行中敲击string input = Console.ReadLine();
并输入非数字的内容,则int.TryParse
将返回false
。这将导致错误消息和Console.ReadKey
的执行。因此,您首先应该在此处摆脱该Console.ReadKey
。
广告2)
您要在调用ReadInteger
之前设置光标位置,而不是在 ReadInteger
内设置光标位置。因此,如果有人输入文本,则通常通过按Enter键来结束输入。然后,您写一行(带有Console.WriteLine
)。因此,如果要使光标位于同一位置,则必须在ReadInteger
方法内的循环中重置其位置。
答案 1 :(得分:-1)
怎么样呢?
public static int ReadInt(string prompt)
{
Console.Clear();
var length = prompt.Length + 2; //2 is for a colon and a space
var position = length;
Console.Write($"{prompt}: ");
string buffer = String.Empty;
int returnNum = 0;
while (true)
{
Console.SetCursorPosition(position, 0);
var charRead = Console.ReadKey();
if(charRead.KeyChar == '\r')
{
return returnNum;
}
if (!int.TryParse(buffer + charRead.KeyChar, out returnNum))
{
Console.SetCursorPosition(position, 0);
Console.WriteLine(" "); //overwrite
Console.SetCursorPosition(0, 1);
Console.Write("Error: enter only digits");
continue;
}
else
{
buffer += charRead.KeyChar;
++position;
//overwrite any error
Console.SetCursorPosition(0, 1);
Console.Write(" ");
}
}
}
这并不完美。它不能处理太多数字的输入。它不处理退格键。它清除了控制台以建立位置(看起来您无法读取控制台的位置,而且我太懒了以至于无法跟踪情况)。
如果确实要处理退格键,请确保不要让用户备份过多。自从我完成低级别的控制台管理已经有好几年了(但没有),但是我记得80年代初期在CP / M中进行过这一操作-如果备份到现在,则OS将会死机(这将是非常在Windows中导致:-))。