You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#控制台程序第二次及后续迭代时输出文本首字母消失问题排查

问题原因及解决方案

问题原因

  1. 错误的按键处理逻辑:你通过(char)Console.ReadKey().Key将ConsoleKey枚举强制转换为字符,这是错误的——ConsoleKey是按键的枚举值(比如ConsoleKey.Escape对应数值27),转换为char后是不可见的控制字符,会干扰控制台输出。
  2. 未禁止按键回显:默认情况下Console.ReadKey()会将用户按下的按键回显到控制台,ESC这类控制字符会导致后续输出异常(比如吞掉提示文本首字母)。
  3. 输入缓冲区残留字符:当用户按下ESC后,输入缓冲区可能残留未处理的字符(比如换行符),会干扰下一次循环的输入和显示逻辑。

修复后的代码

public static void Main()
{
    Console.OutputEncoding = Encoding.UTF8;

    int playersNumber = 0;
    string? name;
    while (true)
    {
        Console.Write($"Write your name, player #{playersNumber}: ");
        string possibleName = Console.ReadLine();

        Console.WriteLine();
        Console.WriteLine("You confirm your choice?");
        Console.WriteLine();
        Console.WriteLine("press ENTER for YES");
        Console.WriteLine("press ESC for REWRITE");

        // 禁止按键回显,避免控制字符干扰输出
        ConsoleKeyInfo keyInfo = Console.ReadKey(true);

        // 直接判断按键枚举,无需转换为char
        if (keyInfo.Key == ConsoleKey.Enter)
        {
            name = possibleName;
            return;
        }
        if (keyInfo.Key == ConsoleKey.Escape)
        {
            // 清空输入缓冲区,避免残留字符影响下一次循环
            while (Console.KeyAvailable)
            {
                Console.ReadKey(true);
            }
            continue;
        }
    }
}

关键修复点

  • 使用Console.ReadKey(true)禁止按键回显,避免控制字符输出到控制台干扰后续显示。
  • 直接判断ConsoleKeyInfo.Key属性,替代错误的枚举转char操作。
  • 继续循环前清空输入缓冲区的残留按键,确保下一次循环的输入逻辑不受影响。

内容的提问来源于stack exchange,提问作者Volodymyr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 06:27:29