C语言if语句失效仅执行else分支,猜词游戏逻辑问题排查
猜词游戏匹配失败问题修复方案
你的代码里有几个关键问题导致猜对了也判定失败,下面是问题点和修复后的代码:
问题分析
- 数组类型错误:用
int myval[]存储字符串完全错误,字符串数组应该用char *myval[]定义。 - 字符串比较方式错误:
==比较的是指针的内存地址,不是字符串内容,必须用strcmp函数来比较,返回0代表内容完全一致。 - 输入函数不安全:
gets函数已被废弃,容易引发缓冲区溢出,换成fgets更安全,同时要处理它会读取换行符的问题。 - 随机索引越界风险:数组有10个元素,但
rand()%9只会生成0-8的索引,最后一个元素B32永远不会被选中,把N改成10才能覆盖所有元素。 - main函数不标准:C标准里
main函数必须是int main()的形式。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> // 引入strcmp需要的头文件 void guess(int N) { int number, numberofguess = 0; // 修正数组类型为字符串指针数组 char *myval[] = {"R22", "B3", "R33", "B232", "R12", "B45", "R2", "B12", "R45", "B32"}; srand(time(NULL)); number = rand() % N; printf("choose a word from {'R22','B3','R33','B232','R12','B45','R2','B12','R45','B32'}\n"); char str[20]; // 用fgets读取输入,避免缓冲区溢出 fgets(str, sizeof(str), stdin); // 去掉fgets读取到的换行符 str[strcspn(str, "\n")] = '\0'; printf("your guess is %s\n", str); // 用strcmp比较字符串内容,返回0表示相等 if (strcmp(str, myval[number]) == 0) { printf("you win\n"); } else { printf("you lose\n"); } printf("the correct word is %s\n", myval[number]); } // 标准main函数写法 int main() { int N = 10; // 修正为10,覆盖所有数组元素 guess(N); return 0; }
关键修改说明
- 把
int myval[]改成char *myval[],正确存储字符串指针。 - 用
strcmp(str, myval[number]) == 0代替str == myval[number],实现字符串内容的比较。 - 替换
gets为fgets,并用strcspn去掉输入末尾的换行符,避免因为换行符导致匹配失败。 - 将N的值改为10,确保随机索引能覆盖数组的所有10个元素。
- 引入
<string.h>头文件,因为strcmp和strcspn都需要这个头文件支持。
内容的提问来源于stack exchange,提问作者Subhraneel
相关产品推荐
相关产品推荐

