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

C语言if语句break失效、do-while循环条件优化问题

问题根因

你遇到的输入3后仍需额外输入才能退出的问题,核心是两点:

  1. 未校验scanf的返回值,当输入缓冲区存在残留的非法字符时,第一个scanf("%d", &option)读取失败,不会给option赋值为3,程序会继续走到读取sum的scanf,陷入等待输入的状态
  2. 现有循环条件option < 10和退出需求option=3时停止没有直接关联,逻辑可读性差
修复后的代码
int main(void){
    double (*func[]) (double) = {func1, func2, func3};
    int option = 0;
    double sum;
    double result;
    do{
        // 校验scanf返回值,确保成功读取到合法整数
        if (scanf("%d", &option) != 1) {
            // 清空输入缓冲区的无效字符,避免循环卡死
            while (getchar() != '\n');
            continue;
        }
        if(option == 3){
            break;
        }
        // 同样校验sum的输入合法性
        if (scanf("%lf", &sum) != 1) {
            while (getchar() != '\n');
            continue;
        }
        printf("%.2lf\n", result = func[option](sum));
    // 优化循环条件,直接关联退出规则
    } while (option != 3 && option < 10);
    return 0;
}
修改说明
  • 新增输入合法性校验:每次调用scanf后判断返回值,确认成功读取到1个合法值后再执行后续逻辑,无效输入会直接清空缓冲区重新输入,不会走到后续的sum读取逻辑,完全符合必须使用scanf作为输入方法的要求
  • 优化循环条件:新增option !=3的判断,和退出需求直接对应,逻辑更直观
  • 输入合法的3时,读取到option值为3会直接触发break跳出循环,不会执行后续读取sum的代码,实现输入3后立即终止程序的效果
  • 函数指针调用简化为func[option](sum),和原写法逻辑完全等价,可读性更好

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:57:02