C#中如何修复回车触发循环异常及空输入误判数字问题?
修复C#输入空回车导致的循环逻辑错误
问题描述
当前代码处理用户输入香蕉购买数量时,输入字母能正常触发循环提示错误,但仅按回车(空输入)时,第一次循环会正确提示,第二次循环却将空输入误判为有效数字,导致执行乘法计算时因转换失败报错。
问题根源
- 空字符串调用
All(char.IsDigit)会返回true(空集合的所有元素默认满足条件),导致空输入被判定为有效数字。 - 使用
Convert.ToDouble转换空字符串会直接抛出异常,没有容错处理。
修复后的代码
using System; class Geeks { public static void Main() { const float kg = 1000; const float bananaKgPrice = 1.69f; const float bananaWeight = 200; const float watermelonKgPrice = 3.29f; double price; string buyChoice; Console.WriteLine("Welcome to our shop! We sell bananas and watermelons."); Console.WriteLine($"Kilo of bananas costs {bananaKgPrice} euros, kilo watermelons {watermelonKgPrice} euros"); bool loopBreakBuyChoice = true; while (loopBreakBuyChoice) { Console.WriteLine("What do you want to buy? 1 - bananas, 2 - watermelons"); buyChoice = Console.ReadLine(); switch (buyChoice) { case "1": loopBreakBuyChoice = false; Console.WriteLine($"Price of bananas per kilo: {bananaKgPrice} euro"); bool loopBreakBananaDigits = true; while (loopBreakBananaDigits) { Console.WriteLine("How much bananas do you want to buy?"); string bananasInput = Console.ReadLine(); // 先检查输入是否为空或全空白 if (string.IsNullOrWhiteSpace(bananasInput)) { Console.WriteLine("Please insert AMOUNT of bananas."); continue; } // 使用TryParse同时验证并转换数字 if (double.TryParse(bananasInput, out double bananaAmount)) { loopBreakBananaDigits = false; price = Math.Round(bananaAmount * bananaWeight / kg * bananaKgPrice, 2); Console.WriteLine($"Total price: {price} euros"); } else { Console.WriteLine("Please insert a valid number."); } } break; case "2": loopBreakBuyChoice = false; Console.WriteLine($"Price of watermelons per kilo: {watermelonKgPrice} euro"); // 可复用香蕉的输入验证逻辑实现西瓜购买流程 break; default: Console.WriteLine("Invalid choice, please enter 1 or 2."); break; } } } }
关键修改点
- 增加
string.IsNullOrWhiteSpace检查,直接拦截空输入和全空白输入。 - 用
double.TryParse替代All(char.IsDigit),既能验证输入是否为有效数字,又能直接获取转换后的数值,避免后续转换异常。 - 补充默认分支处理无效的购买选择,完善程序逻辑。
- 增加总价输出,让程序功能更完整。
内容的提问来源于stack exchange,提问作者максим гурко
相关产品推荐
相关产品推荐

