【问题标题】:Flushing System.Console.Read()冲洗 System.Console.Read()
【发布时间】:2011-11-10 06:43:02
【问题描述】:

我正在为我的一门课程学习 C#,我需要从控制台获取用户输入。

在我的程序中,我有:

choice = (char)System.Console.Read();

稍后在我使用的程序中

if (System.Console.ReadLine() == "y")

从用户那里获取输入。

当我运行程序时,第二个语句被跳过。我猜 System.Console.Read() 在流中留下换行符。在 C/C++ 中,有 fflush() 和 cin.ignore()。 C#中的等价函数是什么?

我知道使用 ReadLine() 或 ReadKey() 对我来说可能更容易,但我只是好奇如何将 Read() 与换行符一起使用

【问题讨论】:

    标签: c#


    【解决方案1】:

    这是我的 fflush 等价物:

    while (Console.KeyAvailable)
        Console.ReadKey(true);
    

    【讨论】:

      【解决方案2】:

      是的,控制台输入由操作系统缓冲。在用户按下 Enter 之前,Read() 调用不会返回。知道这一点后,您可以简单地调用 ReadLine() 来消耗缓冲区。或者首先使用 ReadLine()。

      或者返回单次击键的专用方法:Console.ReadKey()

      但是,如果您希望您的程序与输入重定向一起使用,您就不想使用它。这就是似乎有不止一种方法可以实现相同目标的原因:ReadKey() 绕过标准输入输入流,即被重定向的输入流。它直接与低级控制台支持功能对话。有一种方法可以检测到这一点,因此您可以同时支持两者,请查看this answer

      【讨论】:

        【解决方案3】:
        class Program
        {
        
            static void Main(string[] args)
            {
                if (Console.ReadLine() == "y")
                    Console.WriteLine("You typed y");
        
                Console.ReadLine();
        
            }
        }
        

        你也可以这样做

        if (Console.ReadLine().ToLower() == "y")
                    Console.WriteLine("You typed y");
        

        如果你在做 char c = (char) Console.Read();然后无论您为 Console.Read 键入什么 .. 您都必须在其旁边继续输入 Console.Readline() 语句,Console.Readline 才能工作。

        或者,您可以使用 if (Console.ReadLine().ToLower().Trim() == "y")

        但要让它工作,你需要为 Console.Read() 输入一些东西

        像输入值 N 一样,然后您必须在一些空格后键入 y 以便下一个 Console.ReadLine 进行评估。

        像这样。

            n                y
        

        class Program
        {
        
            static void Main(string[] args)
            {
                char c = (char)Console.Read();
                 if (Console.ReadLine().ToLower().Trim() == "y")
                    Console.WriteLine("You typed y");
        
                Console.ReadLine();
        
            }
        
            //input: n   y
            //output: You typed y
        }
        

        Console.Clear() 方法几乎没有刷新,但这也清除了显示和缓冲区。

        【讨论】:

          猜你喜欢
          • 2018-06-24
          • 1970-01-01
          • 1970-01-01
          • 2010-12-12
          • 2012-06-19
          • 2016-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多