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

为何我的C语言代码无法正确比较数组字符串与scanf输入的字符串?

猜词游戏始终返回0的问题分析与解决

问题根源

你的代码里犯了C语言初学者常见的错误:用==直接比较字符串。

在C语言中,char*类型的变量存储的是字符串的首内存地址,而非字符串内容。string == words[g]比较的是两个指针指向的内存地址是否一致——输入的字符串存在栈上的wordGuess数组里,预设的单词则是只读数据段里的字符串常量,两者地址完全不同,所以这个判断永远为假,导致guessIsCorrect始终被设为0。

另外原代码还有个小逻辑冗余:每次循环不匹配时都会强制把guessIsCorrect设为0,即使之前已经匹配成功(虽然在你的场景里不会发生),这会做不必要的赋值操作。

修复方案

要比较字符串内容,必须使用C标准库的strcmp函数,同时需要引入<string.h>头文件。此外可以优化初始化逻辑,让代码更简洁:

修正后的完整代码

#include <stdio.h>
#include <string.h> // 引入strcmp所需的头文件

int itrThroughWords(char *string) {
    int guessIsCorrect = 0; // 初始化为错误状态,默认不匹配

    const char* words[] = {"Wall", "Insect", "Cereal", "Skateboard"};
    for (int g = 0; g <= 3; g++) {
        // strcmp返回0表示两个字符串内容完全相同
        if (strcmp(string, words[g]) == 0) {
            guessIsCorrect = 1;
            break;
        }
    }

    return guessIsCorrect;
}

int main() {
    printf("Guessing game! Guess a word correctly and you win!\n");
    char wordGuess[20];
    int correctGuess;

    for (int i = 5; i >= 0; i--) {
        printf("Attempts remaining: %d | ", i);
        scanf("%s", wordGuess);
        correctGuess = itrThroughWords(wordGuess);

        if (correctGuess == 1) {
            printf("You have guessed correctly!");
            break;
        } else {
            printf("Incorrect :( Guess again!\n");
        }
    }

    return 0;
}

关键说明

  • strcmp(a, b)会逐字符比较两个字符串的ASCII值:
    • 返回0 → 两个字符串完全相同
    • 返回正数 → a的字典序大于b
    • 返回负数 → a的字典序小于b
  • 初始化guessIsCorrect为0后,只有匹配成功时才修改为1,循环结束后直接返回结果,逻辑更清晰,避免了原代码中的冗余赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:41:10