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

CS50第五周Trie练习:check函数无法正确识别无效输入

CS50 Trie Check函数错误排查

我正在完成CS50课程中的Trie练习题,编写的check函数需检查用户输入是否存在于主函数创建的Trie中。代码如下:

bool check(char* word)
{
    node *temp = malloc(sizeof(node));
    temp = root;

    for (int i = 0; i < strlen(word); i++){
        int ix = tolower(name[i]) - 'a';
        if (ix < 0 || ix => SIZE_OF_ALPHABET){
            return false;
        }
        if (temp->children[ix] == NULL && temp->is_word == false){
            return false;
        }
        temp = temp->children[ix];
    }
    return true;
}

程序可正常编译运行,但输入本应不存在的无效名称时,仍输出该名称已存在,请问代码错误在哪?


错误点分析及修正方案

  • 无用malloc导致内存泄漏:先给temp分配内存后立刻指向root,分配的内存无法回收,属于无效操作。直接改为node *temp = root;即可。
  • 变量名误用:函数参数是word,但循环中使用了name[i],这会导致检查的不是用户输入的字符串,必须修正为tolower(word[i])。
  • 运算符语法错误:C语言不存在=>运算符,此处应为ix >= SIZE_OF_ALPHABET。
  • 核心逻辑错误:
    1. 当temp->children[ix]为空时,说明输入单词的路径已中断,应直接返回false,无需附加其他条件。你当前的判断逻辑完全颠倒,会放过很多无效情况。
    2. 循环结束后不能直接返回true,必须检查当前节点的is_word标记——输入的可能只是某个单词的前缀,而非完整的存入单词。

修正后的代码示例

bool check(char* word)
{
    node *temp = root;

    for (int i = 0; word[i] != '\0'; i++){
        char c = tolower(word[i]);
        int ix = c - 'a';
        if (ix < 0 || ix >= SIZE_OF_ALPHABET){
            return false;
        }
        if (temp->children[ix] == NULL){
            return false;
        }
        temp = temp->children[ix];
    }
    return temp->is_word;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:42:59