C语言isWordInArray函数异常:无法输出单词数组检测结果
单词猜谜验证代码修复方案
核心问题分析
你的代码中isWordInArray函数及相关逻辑存在3个关键错误,导致检测逻辑失效:
1. 单词数量计算错误
main函数中int wordCount = sizeof(word) / sizeof(words_array[0]);的计算完全错误:
sizeof(word)是单个char数组的大小(100),sizeof(words_array[0])也是单个单词数组的大小(100),得到的结果是1,导致isWordInArray只遍历1个元素就结束,根本没检查全部单词。- 正确做法是使用读取文件时统计的
wordCountTextFile,这才是实际的单词库数量。
2. isWordInArray函数返回值逻辑颠倒
- 函数中找到单词时返回0,未找到返回1,但main里的判断
else if (isWordInArray(...))仅在返回1时执行,此时是未找到单词,但你却提示“在数组中”,逻辑完全相反。 - 同时函数的返回值不符合C语言常规(通常用1表示成功/存在,0表示失败/不存在),容易混淆。
3. containsLetterL函数逻辑与命名不匹配
- 函数名是检测字母L,但实际代码是检测字母C,注释也写错了,导致代码可读性差,容易出错。
修复后的完整代码
#include <stdio.h> #include <string.h> // 检测单词是否包含数字 int hasNumbers(const char *word) { int len = strlen(word); for (int i = 0; i < len; i++) { if (word[i] >= '0' && word[i] <= '9') { return 1; // 找到数字 } } return 0; // 无数字 } // 检测单词是否包含符号(非字母、数字、空格) int containsSymbol(const char *word) { while (*word) { if ((*word >= 'A' && *word <= 'Z') || (*word >= 'a' && *word <= 'z') || (*word >= '0' && *word <= '9') || *word == ' ') { word++; } else { return 1; // 找到符号 } } return 0; // 无符号 } // 检测单词是否包含中心字母C int containsLetterC(const char *word) { for (int i = 0; word[i] != '\0'; i++) { if (word[i] == 'C' || word[i] == 'c') { return 1; // 找到C } } return 0; // 未找到C } // 检测单词是否在单词库数组中 int isWordInArray(char word[], char words[100][100], int wordCount) { for (int i = 0; i < wordCount; i++) { if (strcmp(word, words[i]) == 0) { return 1; // 找到单词,返回1 } } return 0; // 未找到单词,返回0 } int main () { // 从文本文件读取单词到数组 FILE *file; char wordA1[100]; // 单个单词最大长度99 char words_array[100][100]; // 最多存储100个单词 // 打开文件 file = fopen("wordlist_Game1.txt", "r"); if (file == NULL) { printf("文件未找到或无法打开。\n"); return 1; } int wordCountTextFile = 0; // 读取文件中的单词到数组 while (fscanf(file, "%99s", wordA1) == 1) { strcpy(words_array[wordCountTextFile], wordA1); wordCountTextFile++; } fclose(file); // 主程序逻辑 char word[100]; int wordCount = wordCountTextFile; // 使用实际读取的单词数量 while (1) { printf("\n你的谜题:\n"); printf(" C T U L H N A\n"); printf("猜一个单词,输入END退出:"); scanf("%s", word); printf("%s\n", word); // 检测是否退出 if (strcmp(word, "END") == 0) { printf("你输入了'END',程序退出。\n"); break; } // 检测是否包含数字 else if (hasNumbers(word)) { printf("单词包含数字,请重新输入。\n"); } // 检测是否包含符号 else if (containsSymbol(word)) { printf("单词包含符号,请重新输入。\n"); } // 检测是否包含中心字母C else if (!containsLetterC(word)) { printf("单词未包含中心字母'C',请重新输入。\n"); } // 检测单词是否在库中 else if (isWordInArray(word, words_array, wordCount)) { printf("%s 是有效的单词!\n", word); // 这里可以添加找到有效单词后的后续逻辑 } else { printf("%s 不在单词库中,请重新输入。\n", word); } } }
修复说明
- 修正单词数量计算:用
wordCountTextFile代替错误的sizeof计算,确保遍历全部单词。 - 调整
isWordInArray逻辑:找到单词返回1,未找到返回0,main中对应调整判断和提示文字,符合需求(找到则继续,未找到提示并重试)。 - 修正
containsLetterL函数:重命名为containsLetterC,调整返回值逻辑(找到返回1),匹配实际检测的字母C,提升代码可读性。 - 优化提示文字:让提示更清晰,符合用户操作预期。
内容的提问来源于stack exchange,提问作者Firdaus
相关产品推荐
相关产品推荐

