C语言中如何实现用户输入整数的校验及循环提示修正?(附代码求助)
解决C语言整数输入校验的问题
嘿,作为编程新手遇到输入校验的问题太正常了,我来帮你搞定这个!你的代码核心逻辑没问题,但确实缺了非整数输入的校验处理——当用户输入字母、符号这类非整数内容时,scanf会读取失败,而且错误的输入会留在缓冲区里,导致后续的输入操作全部混乱,甚至陷入死循环。
核心问题分析
当你用scanf("%i", &ca)时,如果用户输入的不是整数(比如abc),scanf会返回0(表示没成功读取到预期的输入),而且这些错误字符会留在输入缓冲区中。接下来的scanf会反复读取这些错误内容,永远拿不到有效输入,这就是你之前实现不了的关键原因。
解决方案步骤
我们需要给每个输入加两个关键处理:
- 检查
scanf的返回值,判断是否成功读取了整数 - 输入错误时,清空输入缓冲区里的垃圾内容,避免影响后续输入
修改后的完整代码
#include <stdio.h> int main() { int ca; // 当前高度(Current altitude) int ta; // 目标高度(Target altitude) int dd; // 下降/爬升距离(Distance for descent/climb) int gs; // 地速(Ground speed) char cont; // 用于控制程序继续或退出的变量 do { // 输入当前高度,校验是否为整数 printf("请输入当前高度: "); while (scanf("%i", &ca) != 1) { // 清空输入缓冲区的垃圾字符 while (getchar() != '\n'); printf("输入无效,请输入一个整数: "); } // 输入目标高度:先校验整数,再校验与当前高度不同 printf("\n请输入目标高度: "); while (scanf("%i", &ta) != 1) { while (getchar() != '\n'); printf("输入无效,请输入一个整数: "); } while(ca == ta) { printf("目标高度必须与当前高度不同!请重新输入: "); // 这里也要确保输入是整数 while (scanf("%i", &ta) != 1) { while (getchar() != '\n'); printf("输入无效,请输入一个整数: "); } } // 输入下降/爬升距离,校验整数 printf("\n请输入下降/爬升距离: "); while (scanf("%i", &dd) != 1) { while (getchar() != '\n'); printf("输入无效,请输入一个整数: "); } // 输入地速,校验整数 printf("\n请输入地速: "); while (scanf("%i", &gs) != 1) { while (getchar() != '\n'); printf("输入无效,请输入一个整数: "); } // 计算部分优化后保持逻辑不变 int ad = ta - ca; float time = (float)dd / gs; // 用强制类型转换替代乘1.0,写法更清晰 int fpm = ad / (time * 60); if(fpm > 0) { printf("\n飞机需要以%i FPM的速率爬升(未包含高度截获阶段)\n", fpm); } else { printf("\n飞机需要以%i FPM的速率下降(未包含高度截获阶段)\n", -fpm); // 把负数转成正数显示,更符合阅读习惯 } // 继续/退出的输入校验 printf("\n是否要再次运行程序?(y/n) "); while(scanf(" %c", &cont) != 1 || (cont != 'y' && cont != 'Y' && cont != 'n' && cont != 'N')) { while (getchar() != '\n'); printf("\n请输入y或n: "); } printf("\n"); } while(cont == 'Y' || cont == 'y'); return 0; }
关键改动说明
- 输入校验循环:每个整数输入都用
while (scanf("%i", &var) != 1)判断是否成功读取整数,失败就清空缓冲区并提示重新输入。 - 清空输入缓冲区:
while (getchar() != '\n');会逐个读取缓冲区字符直到换行,把所有错误输入清空,确保下一次scanf能读取新内容。 - 显示优化:下降速率输出时用
-fpm,把负数转成正数,符合用户阅读习惯(比如显示“下降500FPM”而不是“-500FPM”)。 - 类型转换优化:把
dd*1.0 / gs*1.0改成(float)dd / gs,强制类型转换的写法更清晰易懂。
这样修改后,不管用户输入什么非整数内容,程序都会提示重新输入有效整数,再也不会出现死循环的问题啦!
内容的提问来源于stack exchange,提问作者Pollot
相关产品推荐
相关产品推荐

