为何我的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
相关产品推荐
相关产品推荐

