【问题标题】:Console.ReadKey(false) in C# something fishy about itC# 中的 Console.ReadKey(false) 有点可疑
【发布时间】:2011-09-11 16:03:54
【问题描述】:

我正在尝试用 C# 制作一个简单的应用程序,其中我输入的每个字符都显示在控制台窗口中。这是我的代码:

class Program {
    static void Main(string[] args) {
        while (true) {
            System.ConsoleKeyInfo input;
            input = Console.ReadKey(false);
            String d = input.ToString();
            char c = d[0];
            Console.WriteLine(c);
        }
    }
}

问题是字符显示不正确,更准确地说,每个字符后面都有一个'S'。例如,我输入“a”并得到“aS”而不是“a”。有什么解决办法吗?提前谢谢!

【问题讨论】:

  • input.ToString() 不会像您认为的那样做,使用调试器很容易看到。检查此答案以获取向您展示如何使用 KeyChar 属性的代码:stackoverflow.com/questions/4804968/…

标签: c#


【解决方案1】:

您看到的是以下内容:

  • 您输入的原始字符,因为您将false 而不是true 传递给ReadKey
  • 字符串“System.ConsoleKeyInfo”的第一个字符,因为ToString() 方法返回类型名称(此处),而不是输入的字符。

改用以下代码来实现您的尝试:

while(true)
{
    ConsoleKeyInfo info = Console.ReadKey(true);
    Console.WriteLine(info.KeyChar);
}

【讨论】:

    【解决方案2】:

    因为input.ToString() == "System.ConsoleKeyInfo" :-) 根据你想做什么,试着写input.KeyChar

    【讨论】:

    • ...有一个包含实际字符的属性。
    • @bzlm No KeyChar 是带键的字符。因此,如果您按A,它将是A。如果您按 F1 它将是 \0 并且您必须查看 Key 属性以查看按下了什么键
    【解决方案3】:

    Console.ReadKey(false); 的参数定义了您键入的密钥是否被拦截。所以Console.ReadKey(false); 打印你输入的字符,Console.Writeline(c) 打印S

    【讨论】:

      【解决方案4】:

      改用char c = input.KeyChar;

      【讨论】:

        【解决方案5】:

        问题是您在System.ConsoleKeyInfo 上使用ToString()。当它变成一个字符串时,你会得到"System.ConsoleKeyInfo",因此第一个字符是'S'。您的意思是改为编写以下代码吗?

        while (true)
        {
            var input = Console.ReadKey(false);
            Console.WriteLine(input.KeyChar);
        }
        

        使用该代码,每个字符都会被复制(所以你会得到aabbccddee)。将ReadKey 中的false 更改为true 以解决该问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-14
          • 2018-12-25
          • 2021-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-27
          • 1970-01-01
          相关资源
          最近更新 更多