C语言猜数字程序非整数输入异常及冗余代码优化咨询
C语言猜数字程序问题修复方案
原程序代码
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int num, count = 0, ans; srand(time(0)); ans = rand() % 1000; printf("Im thinking about a three digit number.\nCan you guess it??\n"); do { printf("\nENTER YOUR GUESS:\n"); scanf("%d", &num); if (num < ans) { printf("Enter a higher number!!!\n"); } else if (num > ans) { printf("Enter a lower number!!!\n"); } else if (num == ans) { printf("\n =================\n"); printf(" || CONGRATULATIONS!! ||\n =================\n\nYOU HAVE GUESSED THE CORRECT NUMBER.\n"); } else { printf("ENTER A VALID 3 DIGIT NUMBER!!!"); } count++; } while(num != ans); printf("You took %d chances to answer!\n", count); return 0; }
存在的问题
- 用户输入字母、符号等非整数内容时,程序会无限打印“Enter a lower number!!!”
- 代码最后一个else语句是冗余代码,永远无法被执行
修复方案
1. 解决非整数输入导致的无限循环问题
scanf("%d", &num)读取整数时,若输入非整数会返回0表示读取失败,且非法输入会留在输入缓冲区中。后续循环里scanf会反复读取这些非法内容,导致num值保持不变,触发固定分支无限循环。
修复步骤:
- 检查
scanf的返回值,当返回值不等于1(成功读取1个整数的标志)时:- 用
getchar()清空输入缓冲区的所有非法内容,直到读到换行符 - 提示用户输入有效整数
- 跳过当前循环的计数和判断逻辑,避免错误分支触发
- 用
2. 删除冗余else语句
前面的if-else if已经覆盖了num < ans、num > ans、num == ans所有整数比较情况,最后一个else永远不会被执行,直接删除即可。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int num, count = 0, ans; srand(time(0)); ans = rand() % 1000; printf("Im thinking about a three digit number.\nCan you guess it??\n"); do { printf("\nENTER YOUR GUESS:\n"); // 检查scanf读取是否成功 if (scanf("%d", &num) != 1) { // 清空输入缓冲区的非法内容 while (getchar() != '\n'); printf("请输入有效的整数!\n"); continue; } // 额外补充:限制输入必须是三位数(原程序提示猜三位数但未做限制) if (num < 100 || num > 999) { printf("请输入一个三位数!\n"); continue; } if (num < ans) { printf("Enter a higher number!!!\n"); } else if (num > ans) { printf("Enter a lower number!!!\n"); } else { printf("\n =================\n"); printf(" || CONGRATULATIONS!! ||\n =================\n\nYOU HAVE GUESSED THE CORRECT NUMBER.\n"); } count++; } while(num != ans); printf("You took %d chances to answer!\n", count); return 0; }
内容的提问来源于stack exchange,提问作者Maxus_red
相关产品推荐
相关产品推荐

