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
相关产品推荐
相关产品推荐

