C#如何使重复的输入重叠?

时间:2018-11-14 20:36:35

标签: c#

当输入的类型不是整数时,程序应失败。但是,有两个问题:

  1. 键入字母后,我得到“无效”响应,然后,如果下一个输入是数字,它将不接受并说“无效”。
  2. 当输入错误的数字时,如何使它停留在同一行并仅清除屏幕上的先前输入(并允许从同一位置重试)?

    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();
        }
    }
    

2 个答案:

答案 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中导致:-))。