C语言调用scanf()时重复要求用户输入两次该如何解决?
问题原因分析
- 触发两次输入的核心原因:代码中连续调用了2次
scanf("%lf", &a),第一次执行时要求用户输入一次,if判断中的第二个scanf又会触发第二次输入要求,自然会出现需要输两次内容的问题。 - 额外逻辑错误:while循环的判断条件写为
controllo1 = 1,这是赋值操作而非相等判断,永远返回真,就算后续把controllo1设为0,下一次循环也会被重新赋值为1,等价于死循环,正确写法为controllo1 == 1。 - 残留字符处理逻辑错误:
%lf格式符本身会自动跳过输入前的所有空白字符(空格、换行、制表符等),不需要额外单独调用getchar处理,且单次getchar只会吃掉一个字符,如果输入后残留多个字符就会出现逻辑异常。
修复后代码
#include <stdio.h> #include <math.h> int main() { double a = 0; double b = 0; double c = 0; //controls wether a is a number int controllo1 = 1; // 修正循环判断条件为相等判断 while (controllo1 == 1) { printf("insert x^2: "); // 仅保留一次scanf调用,直接用返回值判断是否读取成功 if (scanf("%lf", &a) == 1) { printf("input is a number\n"); controllo1 = 0; // 清空当前输入行剩余的所有残留字符 while(getchar() != '\n'); } else { printf("input is not a number\n"); // 输入失败也清空整行错误内容,避免影响下一次读取 while(getchar() != '\n'); } } return 0; }
修复说明
- 移除重复的
scanf调用,仅保留一次读取操作,直接通过scanf的返回值判断读取结果(返回1代表成功读取到1个double类型值) - 修正while循环的判断条件,将赋值操作改为相等判断
- 统一缓冲区清空逻辑,无论读取成功失败都清空当前输入行的所有残留内容,不会出现漏清或多清的问题
内容的提问来源于stack exchange,提问作者Gio Bur
相关产品推荐
相关产品推荐

