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; }
额外优化说明
- 补充了
<stdio.h>头文件:原代码使用printf和scanf但未包含对应头文件,部分编译器会触发警告或错误; - 增加输入有效性检查:如果用户输入非数字,程序会提示并清空缓冲区,避免再次陷入循环;
- 修正拼写错误:把
Higher nummber please!改为正确的Higher number please!; - 在成功提示中加入用户名,提升交互体验。
内容的提问来源于stack exchange,提问作者Mohammad Afraz
相关产品推荐
相关产品推荐

