C语言while循环多条件使用时answer值异常变更问题求助
问题分析与修复
1. 数组越界导致answer被意外修改
你代码里的while循环初始条件有严重问题:第一次进入循环时i=0,guess[i-1]就是guess[-1]——C语言不允许数组下标为负数,这属于数组越界访问,会触发未定义行为。
这种情况下,程序会读写数组内存范围之外的区域,刚好你的answer变量的内存位置可能和这个越界地址重叠,所以就被意外改成了guess里的值,这就是你看到answer莫名变化的原因。
2. if判断误用赋值运算符而非比较运算符
最后判断对错的if(guess[i-1] = answer)是错误的:=是赋值符号,不是比较符号。这行代码会把answer的值赋给guess[i-1],然后因为赋值结果非零,永远会执行“答对了”的分支,完全起不到判断对错的作用,必须改成==。
修复后的完整代码
#include<stdio.h> #include<stdlib.h> int main(){ int answer = 10; int guess[3]; // 3次猜测机会,数组开3个位置才够 int i = 0; int remainingGuesses = 3; // 修正拼写错误:remaning -> remaining // 重新设计循环逻辑:先输入再判断,彻底避免越界问题 while(remainingGuesses > 0){ printf("Remaining guesses %d. Enter a number: ", remainingGuesses); scanf("%d", &guess[i]); // 输入后直接检查是否猜对,猜对就跳出循环 if(guess[i] == answer){ break; } i++; remainingGuesses--; } printf("Total attempts: %d\n", i+1); printf("Your last guess: %d\n", guess[i]); printf("Correct answer: %d\n", answer); if(guess[i] == answer){ printf("Your answer is right!\n"); }else{ printf("Your answer is wrong!\n"); } return 0; }
额外优化说明
- 原数组大小为2,但你设置了3次猜测机会,第三次输入时会再次越界,所以调整为3
- 循环逻辑改为先输入再判断,彻底规避了第一次循环就访问
guess[-1]的无效内存问题 - 修正了变量名的拼写错误,提升代码可读性
内容的提问来源于stack exchange,提问作者TanfeexUlhaqq
相关产品推荐
相关产品推荐

