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

C语言猜数字游戏for循环无法终止问题排查求助

问题分析与解决方案

你的问题出在for循环的条件判断时机上,我来给你拆解清楚:

原循环的条件是for (i = 0; guesses[i] != randomNumber; i++),这个条件是在每一轮循环开始前检查的:

  • 第一次循环:i=0,guesses[0]初始是0,不等于随机数,进入循环,用户输入猜的数字到guesses[0]。
  • 如果猜对了,你输出了提示,但循环体执行完后,i会自动自增到1。
  • 下一轮循环开始时,检查guesses[1]的值(还是初始化的0),0肯定不等于你的随机数(1-20之间),所以循环会继续执行,让你继续输入。

简单说:猜对的时候,循环已经走完了当前轮次,下一轮检查的是数组里下一个未被赋值的元素(0),自然不会终止循环。


修复方案(两种常用方式)

方式1:猜对时直接跳出循环(最直观)

在猜对的if分支里添加break;语句,一旦猜对就立刻终止循环,不需要等到下一轮条件检查:

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include <stdlib.h>
int main(void) {
 time_t t;
 srand(time(&t));
 int randomNumber = (rand() % 19) + 1;
 int guesses[30] = {0};
 int i;
 for (i = 0; i < 30; i++) { // 新增:限制循环次数,防止数组越界
 printf("Hello master, I will grant you 3 wishes if you can guess what number I have selected between 1 and 20: ");
 scanf("%d", &guesses[i]);
 if (guesses[i] == randomNumber) {
 printf("It took you %d guesses to guess correct but I lied I cannot grant you any wishes, have a nice day. \n\n", i + 1);
 break; // 新增:猜对后直接跳出循环
 } else if(guesses[i] < randomNumber) {
 printf("You guessed too low, try a higher number. \n\n");
 } else if(guesses[i] > randomNumber) {
 printf("You guessed too high, try a lower number. \n\n");
 }
 }
 // 新增:如果用户用完所有次数仍未猜对,给出提示
 if (i >= 30) {
     printf("You've used all 30 guesses! The number was %d.\n", randomNumber);
 }
 return 0;
}

方式2:用标志变量控制循环

定义一个布尔变量来标记是否猜对,循环条件改为检查这个标志,逻辑会更清晰:

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include <stdlib.h>
int main(void) {
 time_t t;
 srand(time(&t));
 int randomNumber = (rand() % 19) + 1;
 int guesses[30] = {0};
 int i = 0;
 int isCorrect = 0; // 标志变量:0=未猜对,1=已猜对
 while (!isCorrect && i < 30) { // 用while循环更贴合标志变量的逻辑
 printf("Hello master, I will grant you 3 wishes if you can guess what number I have selected between 1 and 20: ");
 scanf("%d", &guesses[i]);
 if (guesses[i] == randomNumber) {
 printf("It took you %d guesses to guess correct but I lied I cannot grant you any wishes, have a nice day. \n\n", i + 1);
 isCorrect = 1; // 设置标志,终止循环
 } else if(guesses[i] < randomNumber) {
 printf("You guessed too low, try a higher number. \n\n");
 } else if(guesses[i] > randomNumber) {
 printf("You guessed too high, try a lower number. \n\n");
 }
 i++;
 }
 if (i >= 30) {
     printf("You've used all 30 guesses! The number was %d.\n", randomNumber);
 }
 return 0;
}

额外提醒

我在两个方案里都加了i < 30的限制——因为你的数组大小是30,如果用户一直猜不对,循环会无限制执行,导致数组越界(访问guesses[30]及以后的内存),这会触发未定义行为,加上这个限制能让程序更健壮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:48:12