You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 00:15:59