我一直在努力完成CS50课程中的Trie练习题.我编写的check函数必须判断是否在main函数中创建的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;
}

程序编译和运行得很好,但是,每当我故意输入一个不应该被找到的无效名称时,程序仍然输出已经找到该名称,这应该不会发生.有没有人能解释一下我的错误是什么?先谢谢你.

推荐答案

首先,应该将函数声明为

bool check( const char *word );

因为传递的字符串在函数内不会更改.

该函数会在此代码片段中产生内存泄漏

node *temp = malloc(sizeof(node));
temp = root;

也就是说,首先动态分配存储器并且将其地址分配给指针temp,然后重新分配该指针.因此,在这种情况下不可能释放已分配的内存.

实际上,这两个内存都不应该分配.

使用功能strlen是多余的.

至于您的问题,那么在下面的if语句中

if (temp->children[ix] == NULL && temp->is_word == false){

必须使用逻辑OR运算符,而不是逻辑AND运算符

if (temp->children[ix] == NULL || temp->is_word == false){

该函数可能如下所示

bool check( const char *word )
{
    bool present = root != NULL && *word != '\0';

    for ( node *temp = root; present && *word; ++word )
    {
        present = isalpha( ( unsigned char )*word );
        
        if ( present )
        {
            int ix = tolower( *word ) - 'a';

            present = ix < SIZE_OF_ALPHABET && temp->children[ix] != NULL && temp->is_word;

            if ( present ) temp = temp->children[ix];
        }
    }

    return present;
}

C++相关问答推荐

segfault在C中使用getline()函数

无效使用未定义类型'structsquare'?

如果实际的syscall是CLONE(),那么为什么strace接受fork()呢?

如何正确地索引C中的 struct 指针数组?

为什么可以通过指向常量int的指针间接地改变整数的值?

为什么在C中进行大量的位移位?

如何在C客户端应用程序的ClientHello消息中添加自定义扩展?

用C宏替换strncMP函数中的参数

具有交换链获取和命令缓冲区提交的同步-危险-读后写错误

C-使用指针返回修改后的整数数组

如何使解释器存储变量

Square不与Raylib一起移动

链接到底是如何工作的,我在这里到底做错了什么

不带Malloc的链表

有没有办法减少C语言中线程的堆大小?

c程序,让用户输入两类数字,并给出输出用户输入多少个数字

为什么这个代码的最后一次迭代不能正常工作?

c如何传递对 struct 数组的引用,而不是设置 struct 的副本

使用替代日历打印日期

全局变量 y0 与 mathlib 冲突,无法编译最小的 C 代码