for循环嵌套do-while的血压输入验证问题:非法值仍被累加求助
问题解决方案
问题根源
你的代码核心问题是:无论输入的舒张压是否合法,都会执行sumDia += dia[i],导致非法值被错误累加到总和里。
修复方案
把累加操作移到do-while循环结束之后——因为循环退出的条件是输入值在40-100范围内,此时dia[i]已经是合法值,再累加就不会出错。同时建议加上输入缓冲区清理逻辑,避免用户输入非数字时触发无限循环。
修改后的代码:
for (i = 0; i < 5; i++) { do { // 提示输入舒张压 printf("Enter the Diastolic (bottom) part of your 5 blood pressure tests in the range 40-100 (in mmHg):\n"); // 处理scanf失败的情况,比如输入非数字 if (scanf("%f", &dia[i]) != 1) { printf("Error, please enter a valid number.\n"); // 清空输入缓冲区的非法字符 while (getchar() != '\n'); // 给dia[i]赋值一个非法值,确保循环继续 dia[i] = -1; continue; } if (dia[i] < 40 || dia[i] > 100) { printf("Error, Please input your Diastolic blood pressure within the range 40-100.\n"); } } while (dia[i] < 40 || dia[i] > 100); // 循环退出后,输入合法,再累加 sumDia += dia[i]; }
逻辑说明
- 累加时机调整:只有当输入通过合法性校验(
do-while循环正常退出),才将dia[i]加入总和,彻底避免非法值混入。 - 输入异常处理:增加
scanf返回值判断,如果用户输入非数字(比如字母、符号),会提示错误并清空缓冲区,防止非法字符留在缓冲区导致后续scanf持续失败,引发无限循环。
内容的提问来源于stack exchange,提问作者Casper
相关产品推荐
相关产品推荐

