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

高低猜数游戏:while循环中输入整数判断及无限循环修复

修复猜数字游戏的输入错误无限循环问题

问题说明

现有猜数字游戏代码在用户输入非整数(如字符串)时,会陷入无限循环,反复输出提示却无法接收新输入。原代码如下:

// Created on: Oct 2023    
// This program allows the user to guess a number between 0-9  
#include <stdlib.h>  
#include <stdio.h>  
#include <time.h>  

int main() {  
    // this function allows the user to guess a number  
    // and the program decides if the user is correct  

    unsigned int seed = time(NULL);  
    int randomNumber = rand_r(&seed) % 9;  
    int num = 0;  
    int scanerrorcode = 0;  
    
    while (1)  
    {  
        printf("\nGuess a number between 0-9: ");  
        scanf("%d", &num);
        if (num < 0 || num > 9) {
            printf("\n%d is not between 0-9", num);
        } else if (num == randomNumber) {
            printf("\nYou guessed correctly!");
            break;
        } else if (num > randomNumber) {  
            printf("\nYou guessed too high!");  
        } else if (num < randomNumber) {  
            printf("\nYou guessed too low!");  
        } else {  
            printf("\nError, %d is not a number", num);  
        }  
    }  

    printf("\nDone.");  
}

问题根源

  1. 输入非整数时,scanf("%d", &num)匹配失败,返回值不为1,但代码未检查返回值,错误输入会留在输入缓冲区,导致后续循环中scanf反复读取无效内容,触发无限循环。
  2. 原代码的else分支永远不会执行,因为前面的条件已覆盖所有整数情况。
  3. 随机数生成用%9,实际生成范围是0-8,不符合题目0-9的要求。

修复后的代码

// Created on: Oct 2023    
// This program allows the user to guess a number between 0-9  
#include <stdlib.h>  
#include <stdio.h>  
#include <time.h>  

int main() {  
    unsigned int seed = time(NULL);  
    // 修正随机数范围为0-9
    int randomNumber = rand_r(&seed) % 10;  
    int num = 0;  
    int scan_result;  
    
    while (1)  
    {  
        printf("\nGuess a number between 0-9: ");  
        // 检查scanf的返回值,成功读取整数时返回1
        scan_result = scanf("%d", &num);
        
        // 处理输入错误(非整数)
        if (scan_result != 1) {
            printf("\n请输入有效的整数!");
            // 清空输入缓冲区的无效字符
            while (getchar() != '\n');
            continue;
        }
        
        // 检查输入范围
        if (num < 0 || num > 9) {
            printf("\n%d 不在0-9范围内", num);
        } else if (num == randomNumber) {
            printf("\n你猜对了!");
            break;
        } else if (num > randomNumber) {  
            printf("\n猜大了!");  
        } else {  
            printf("\n猜小了!");  
        }  
    }  

    printf("\n游戏结束。");  
}

关键修复点

  • 检查scanf的返回值,判断是否成功读取整数。
  • 输入错误时,用while (getchar() != '\n')清空输入缓冲区,避免无效字符残留。
  • 修正随机数生成逻辑,用%10确保范围是0-9。
  • 移除无用的else分支,简化逻辑。

内容的提问来源于stack exchange,提问作者kakarot 22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:15:22