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

C#读取至EOF且忽略回车键?解决FormatException输入格式错误

修复C#温度转换程序的FormatException问题并实现EOF读取

刚从C转C#的时候确实容易踩这个坑——你遇到的FormatException本质是当用户只按回车键时,Console.ReadLine()返回的是空字符串"",而不是null,这时候直接用Convert.ToDouble()去转换空字符串就会报错,因为它无法识别空内容为有效的数字格式。

另外,你要实现的“读取至EOF”逻辑是对的(控制台里按Ctrl+Z/Windows或Ctrl+D/Unix时Console.ReadLine()会返回null),但缺少了对空输入、无效输入的容错处理。下面是具体的修复方案:

核心改进点

  • 用安全的解析方法替代Convert.ToDouble():比如float.TryParse(),它会返回一个布尔值表示转换是否成功,不会直接抛出异常,更适合处理用户的不确定输入。
  • 先过滤空白输入:如果用户只按回车(输入全是空白字符),直接跳过这次循环,不进行转换。
  • 保留原有的EOF判断逻辑:当Console.ReadLine()返回null时退出循环。

修复后的代码

while (true)
{
    string input = Console.ReadLine();
    // 读取到EOF时退出循环
    if (input == null)
        break;
    
    // 过滤全空白的输入(比如只按回车的情况)
    string trimmedInput = input.Trim();
    if (string.IsNullOrEmpty(trimmedInput))
        continue;
    
    // 安全解析输入为float类型
    if (float.TryParse(trimmedInput, out float celsius))
    {
        float fahrenheit = (float)(1.8 * celsius) + 32;
        Console.WriteLine(fahrenheit);
    }
    else
    {
        // 可选:提示用户输入有效数字
        Console.WriteLine("请输入有效的摄氏温度数值");
    }
}

代码解释

  1. 空白输入过滤:input.Trim()会去掉字符串前后的空白字符(包括回车、空格、制表符等),如果处理后是空字符串,就用continue跳过当前循环,避免进入转换逻辑。
  2. 安全解析:float.TryParse()尝试将字符串转成float,如果成功,结果会存在celsius变量里,同时返回true;如果失败(比如输入的是字母、乱码),返回false,这时候可以给用户提示,也可以直接跳过。
  3. EOF处理:当用户在控制台按下Ctrl+Z(Windows)或Ctrl+D(Linux/macOS)时,Console.ReadLine()返回null,触发break退出循环,完美实现“读取至EOF”的需求。

这样修改后,程序不仅不会因为按回车报错,还能处理各种无效输入,同时正确响应EOF信号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:04:45