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("请输入有效的摄氏温度数值"); } }
代码解释
- 空白输入过滤:
input.Trim()会去掉字符串前后的空白字符(包括回车、空格、制表符等),如果处理后是空字符串,就用continue跳过当前循环,避免进入转换逻辑。 - 安全解析:
float.TryParse()尝试将字符串转成float,如果成功,结果会存在celsius变量里,同时返回true;如果失败(比如输入的是字母、乱码),返回false,这时候可以给用户提示,也可以直接跳过。 - EOF处理:当用户在控制台按下Ctrl+Z(Windows)或Ctrl+D(Linux/macOS)时,
Console.ReadLine()返回null,触发break退出循环,完美实现“读取至EOF”的需求。
这样修改后,程序不仅不会因为按回车报错,还能处理各种无效输入,同时正确响应EOF信号。
内容的提问来源于stack exchange,提问作者Patrik
相关产品推荐
相关产品推荐

