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。 - 核心逻辑错误:
- 当
temp->children[ix]为空时,说明输入单词的路径已中断,应直接返回false,无需附加其他条件。你当前的判断逻辑完全颠倒,会放过很多无效情况。 - 循环结束后不能直接返回
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
相关产品推荐
相关产品推荐

