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

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;
}

关键修改说明

  1. 把int myval[]改成char *myval[],正确存储字符串指针。
  2. 用strcmp(str, myval[number]) == 0代替str == myval[number],实现字符串内容的比较。
  3. 替换gets为fgets,并用strcspn去掉输入末尾的换行符,避免因为换行符导致匹配失败。
  4. 将N的值改为10,确保随机索引能覆盖数组的所有10个元素。
  5. 引入<string.h>头文件,因为strcmp和strcspn都需要这个头文件支持。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:25:32