C语言if语句break失效、do-while循环条件优化问题
问题根因
你遇到的输入3后仍需额外输入才能退出的问题,核心是两点:
- 未校验
scanf的返回值,当输入缓冲区存在残留的非法字符时,第一个scanf("%d", &option)读取失败,不会给option赋值为3,程序会继续走到读取sum的scanf,陷入等待输入的状态 - 现有循环条件
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
相关产品推荐
相关产品推荐

