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

C语言猜数字游戏程序scanf引发无限循环问题的修复咨询

修复猜数字游戏的无限循环问题

你说得没错,第11行的scanf()确实是导致无限循环的核心原因,这里存在两个关键问题需要修正:

问题1:scanf的参数传递错误

scanf("%c", name);里,%c格式符要求传入char类型变量的地址,但你直接传递了name(一个char变量本身),这会触发未定义行为——程序可能破坏内存中的数据,或者完全无法正确读取输入。后续的scanf("%d", &guess)会因为输入缓冲区的异常内容读取失败,guess的值始终无法匹配随机数,最终陷入无限循环。

问题2:单个char无法存储完整用户名

你定义的char name;只能容纳一个字符,但用户输入的名字通常是多个字符,多余的输入会留在输入缓冲区中。当后续读取数字时,scanf会尝试读取这些非数字字符,导致读取失败,进一步加剧循环问题。


修复后的完整代码

#include <stdlib.h>
#include <time.h>
#include <stdio.h> // 补充printf/scanf依赖的头文件

int main(){
    int number, guess, nguesses = 1;
    char name[50]; // 改用字符数组存储用户名,最多支持49个字符
    srand(time(0));
    number = rand()%100 + 1; // 生成1到100之间的随机数

    printf("------| Welcome to Guess the number game |-------\n");
    printf("Enter your name: ");
    scanf("%s", name); // 用%s读取字符串,数组名本身就是指针,无需加&

    do {
        printf("\nGuess the number between 1 to 100\n");
        // 增加输入有效性检查,避免非数字输入导致的循环
        if(scanf("%d", &guess) != 1) {
            printf("请输入有效的数字!\n");
            // 清空输入缓冲区的无效内容
            while(getchar() != '\n');
            nguesses--; // 无效输入不计数
            continue;
        }
        if(guess>number)
            printf("Lower number please!\n");
        else if(guess<number) {
            printf("Higher number please!\n"); // 修正拼写错误:nummber -> number
        } else {
            printf("Congratulations %s! You have correctly guessed the number!\nAttempts taken: %d\n", name, nguesses);
        }
        nguesses++;
    } while (guess!=number);
    return 0;
}

额外优化说明

  1. 补充了<stdio.h>头文件:原代码使用printf和scanf但未包含对应头文件,部分编译器会触发警告或错误;
  2. 增加输入有效性检查:如果用户输入非数字,程序会提示并清空缓冲区,避免再次陷入循环;
  3. 修正拼写错误:把Higher nummber please!改为正确的Higher number please!;
  4. 在成功提示中加入用户名,提升交互体验。

内容的提问来源于stack exchange,提问作者Mohammad Afraz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:07:38