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

C# While循环程序异常:输入未被识别,程序直接执行后续逻辑

你的C#程序问题分析与修复方案

嘿,我帮你定位到了代码里的几个核心问题,这就是为什么程序完全无视用户输入直接执行所有逻辑的原因,下面是问题拆解和修复后的完整代码:

主要问题点

  • 错误使用Console.Read()读取数字:Console.Read()返回的是输入字符的ASCII码值,不是你输入的整数。比如输入"5",它返回的是字符'5'的ASCII码53,输入"-999"时,第一个字符是'-'(ASCII码45),永远触发不了退出条件。而且这个方法只会读取一个字符,剩下的输入内容会被后续的Console.ReadLine()直接读取,导致会员状态的输入被跳过。
  • 会员状态判断逻辑失效:你把输入转成了大写存在upperstring变量里,但判断时却用memberStatus.Equals("Y"),这样输入小写"y"就不会触发会员折扣,逻辑完全没生效。
  • 总费用未实现累加:你每次在循环里重新声明TotalCharge并赋值为+charge,这相当于每次都把当前单次费用赋值给它,根本没有累计之前的总费用。
  • 缺少输入合法性验证:如果用户输入非数字内容,程序会直接报错崩溃,没有容错处理。

修复后的完整代码

static void Main(string[] args)
{
    // Local Variable Declaration
    const double rate1 = 10;
    const double rate2 = 3;
    const double maxCharge = 50;
    double charge;
    int hoursRented;
    // 把总费用声明移到循环外,初始化为0
    double totalCharge = 0;

    while (true)
    {
        Console.WriteLine("Enter number of hours (-999 to quit) : ");
        // 使用int.TryParse处理输入,确保读取有效整数
        if (!int.TryParse(Console.ReadLine(), out hoursRented))
        {
            Console.WriteLine("请输入有效的数字!");
            continue;
        }

        if (hoursRented == -999)
            break;

        // 计算基础费用
        if (hoursRented <= 3)
        {
            charge = hoursRented * rate1;
        }
        else
        {
            charge = (3 * rate1) + ((hoursRented - 3) * rate2);
        }

        // 应用最高费用限制
        if (charge > maxCharge)
        {
            charge = maxCharge;
        }

        Console.WriteLine("Are you a member? (Y/N) : ");
        string memberStatus = Console.ReadLine();
        // 处理空输入的情况
        if (string.IsNullOrWhiteSpace(memberStatus))
        {
            Console.WriteLine("请输入有效的会员状态(Y/N)!");
            continue;
        }
        string upperstring = memberStatus.ToUpper();
        // 使用转成大写后的变量判断,支持大小写输入
        if (upperstring.Equals("Y"))
        {
            charge = charge - (charge * 0.1); // 用0.1代替1/10,避免整数除法问题
        }

        // 累加总费用
        totalCharge += charge;
        Console.WriteLine("Customer Charge : {0} | Total Charge To Date : {1}", charge, totalCharge);
    }
}

关键修改说明

  1. 替换输入读取方式:用int.TryParse(Console.ReadLine(), out hoursRented)代替Console.Read(),既可以正确读取整数输入,还能在用户输入非数字时给出提示,避免程序崩溃。
  2. 修复总费用累加逻辑:把totalCharge的声明移到循环外部,初始化为0,每次循环中用totalCharge += charge实现累计。
  3. 修正会员判断逻辑:使用转成大写后的upperstring进行判断,不管用户输入"Y"还是"y"都能正确触发折扣。
  4. 优化数值计算:把1 / 10改成0.1,避免整数除法导致结果为0的问题(C#中整数除以整数结果还是整数,1/10等于0,之前的折扣逻辑其实没生效)。
  5. 增加容错处理:对会员状态的空输入做了判断,避免空字符串调用ToUpper()报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:39:39