【问题标题】:eliminate line break after read in C#在 C# 中读取后消除换行符
【发布时间】:2019-02-05 17:43:31
【问题描述】:
using A = System.Console;
public void point()
{
    int hour, minute;
    A.Write("Enter Time (HH:MM) = ");
    hour = A.Read();
    A.Write(":");
    minute = A.Read();
}

我希望它像

"输入时间 (HH:MM) = 12(小时输入):49(分钟输入)"

但它就像

"输入时间 (HH:MM) = 12(小时输入)
:49(分钟输入)

【问题讨论】:

  • 这里的A 是什么?
  • 你应该可以使用 Console.Write() 来做到这一点
  • 我认为这是一个控制台应用程序。你正在做的事情有问题。您可以使用 readkey() 而不是 read() 并将输入存储到属性中。并检测何时按下“[Enter]”键,然后显示“:”并开始捕获第二个数字。
  • Read()Write() 的工作方式做出一些假设,这看起来会让用户感到困惑,因为您最初是在提示 both 小时和分钟,但您的代码似乎希望将其输入为<Hours><Enter><Minutes><Enter>。我希望当用户输入<Hours>:<Minutes><Enter> 时,您对Read() 的第一次调用会失败,即使这是您要求他们输入的内容。我认为您最好使用reading the hours and minutes as one String 并将其解析为其组件值。
  • @sean - 使用 readkey() 代替 read() 可能不是一个好主意,因为用户希望处理退格等

标签: c# parsing console-application user-input console-input


【解决方案1】:

最简单的方法(假设您从控制台读取,用户将输入小时然后按Enter,然后输入分钟并按Enter):

static void Main(string[] args)
        {
            int hour = 0, minute = 0;
            const int MAX_NUMBER_OF_DIGITS = 2 ;

            Console.Write("Enter Time (HH:MM) = ");
            
            // store cursor position
            int cursorLeft = Console.CursorLeft;
            int cursorTop = Console.CursorTop;
            
            // use ReadLine, else you will only get 1 character 
            // i.e. number more than 1 digits will not work
            hour = int.Parse(Console.ReadLine());

            Console.SetCursorPosition(cursorLeft + MAX_NUMBER_OF_DIGITS , cursorTop);

            Console.Write(":");

            minute = int.Parse(Console.ReadLine());

            // Nitpickers! purposefully not using String.Format, 
            // or $, since want to keep it simple!
            Console.Write("You entered: " + hour + ":" + minute);
        }

输出:

输入时间 (HH:MM) = 17:55

您进入:17:55

虽然我宁愿向您推荐这样更好且更不容易出错的方式(用户输入 HH:MM 并按一次Enter,即输入一个包含: 即冒号的字符串):

static void Main(string[] args)
{
    int hour = 0, minute = 0;

    Console.Write("Enter Time in format HH:MM = ");

    string enteredNumber = Console.ReadLine();

    string[] aryNumbers = enteredNumber.Split(':');

    if (aryNumbers.Length != 2)
    {
        Console.Write("Invalid time entered!");
    }
    else
    {
        hour = int.Parse(aryNumbers[0]);
        minute = int.Parse(aryNumbers[1]);

        // Nitpickers! purposefully not using String.Format, 
        // or $, since want to keep it simple!
        Console.Write("You entered: " + hour + ":" + minute);

    }
}

【讨论】:

  • 谢谢你,这很有帮助:]
【解决方案2】:

假设A是Console,你可以这样做:

    static void Main()
    {
        int hour, minute;
        char[] hourChars = new char[2];
        Console.Write("Enter Time (HH:MM) = ");
        hourChars[0] = Console.ReadKey().KeyChar;
        hourChars[1] = Console.ReadKey().KeyChar;
        var hourString = new String(hourChars);
        hour = int.Parse(hourString);
        Console.Write(":");
        minute = Console.Read();
    }

【讨论】:

    【解决方案3】:

    假设 A 是标准 c# Console 那么你可以使用 ReadKey 代替 Read

    ReadKey 一次只会读取一个字符,但它不会强迫您按 Enter 键,这是换行的原因。

        static void Main()
        {
            char h1, h2, m1, m2;
            Console.Write("Enter Time (HH:MM) = ");
            h1 = Console.ReadKey().KeyChar;
            h2 = Console.ReadKey().KeyChar;
            Console.Write(":");
            m1 = Console.ReadKey().KeyChar;
            m2 = Console.ReadKey().KeyChar;
        }
    

    我会将实际值解析留作练习。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      相关资源
      最近更新 更多