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

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

修复说明

  1. 修正单词数量计算:用wordCountTextFile代替错误的sizeof计算,确保遍历全部单词。
  2. 调整isWordInArray逻辑:找到单词返回1,未找到返回0,main中对应调整判断和提示文字,符合需求(找到则继续,未找到提示并重试)。
  3. 修正containsLetterL函数:重命名为containsLetterC,调整返回值逻辑(找到返回1),匹配实际检测的字母C,提升代码可读性。
  4. 优化提示文字:让提示更清晰,符合用户操作预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:15:54