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

大一C语言小组作业:控制台计算器输入不匹配时无限报错问题求助

C语言控制台计算器无限循环问题修复方案

核心问题原因

  • 逻辑结构错误导致死循环:原代码的内层while(operationValid == 0)循环中,没有重新读取用户输入的逻辑,一旦首次输入的内容不满足校验条件,程序会一直用旧的非法输入反复判断,无限输出错误提示。
  • fflush(stdin)用法错误:C语言标准仅规定fflush()对输出流有刷新效果,针对输入流stdin使用fflush()属于未定义行为,无法可靠清空输入缓冲区的残留内容。
  • 缺少scanf返回值校验:如果用户输入格式不符合%lf %c %lf的要求(比如输入字母、缺失参数),scanf会匹配失败,错误内容会残留在输入缓冲区,后续所有读取操作都会直接失败,导致循环卡死。

修复后的完整代码

#include <stdbool.h>
#include <stdio.h>

double calculate(double number1, char operation, double number2);

bool isInteger(double val)
{
    int truncated = (int)val;
    return (val == truncated);
}

int main()
{
    double number1, number2, result;
    char operation;
    int validator = 0;
    
    while(validator == 0)
    {
        printf("Enter number and operator to solve:\n\nExample [a + b][a - b][a * b][a / b]\n");
        // 先判断scanf返回值,确认3个参数都匹配成功
        int ret = scanf("%lf %c %lf", &number1, &operation, &number2);
        
        // 清空输入缓冲区所有残留内容,避免影响下次输入
        int c;
        while ((c = getchar()) != '\n' && c != EOF);
        
        if (ret != 3) {
            printf("Input format error! Please enter as example.\n");
            continue;
        }
        
        if(operation == '+' || operation == '-' || operation == '*' || operation == '/')
        {
            if(isInteger(number1) && isInteger(number2))
            {
                // 额外增加除零判断,避免运算异常
                if (operation == '/' && number2 == 0) {
                    printf("Division by zero is not allowed!\n");
                    continue;
                }
                result = calculate(number1, operation, number2);
                printf("%.1lf %c %.1lf = %.1lf\n", number1, operation, number2, result);
                validator = 1;
            }
            else
            {
                printf("Invalid Inputed numbers! Only integers are allowed.\n");
            }   
        }
        else
        {
            printf("Invalid Operation! Only +, -, *, / are supported.\n");
        }
    }
    return 0;
}

double calculate(double number1, char operation, double number2)
{
    double c;
    if(operation == '+')
    {
        c = number1 + number2;
    }
    else if(operation == '-')
    {
        c = number1 - number2;
    }
    else if(operation == '*')
    {
        c = number1 * number2;
    }
    else if(operation == '/')
    {
        c = number1 / number2;
    }
    return c;
}

关键修改说明

  • 删除了冗余的内层while循环,将输入、校验、错误处理放在同一层循环,校验失败直接重新触发输入流程
  • 用标准兼容的while(getchar() != '\n')逻辑实现输入缓冲区清空,保证非法输入不会残留影响后续读取
  • 增加scanf返回值判断,先确认输入格式合法再做后续校验,避免格式错误导致的未知行为
  • 额外增加除零校验,完善运算异常处理
  • 所有错误提示增加换行符,优化输出可读性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:06:04