为什么有些单词会带来细分错误?虽然其他人似乎很好

时间:2019-02-11 12:22:03

标签: c++ dictionary trie

使用Trie在C ++中制作字典。在某些输入上出现分段错误。

调试帮助我发现问题出在检查功能中。特别是在退出循环后,在检查isword条件下。

typedef struct node
{
    bool is_word;
    struct node *children[27];
} node;

node *createNode()
{
    // Void -> Node*
    // Create a pointer to a node(structure)
    // Allocate memory and store address in child pointer
    node *child = (node *)malloc(sizeof(node));
    // Initialize each node in child to NULL
    for (int i = 0; i < N; i++)
    {
        child->children[i] = NULL;
    }
    // Initialize the is_word variable
    child->is_word = false;
    // Return the pointer
    return child;
}

bool check(const char *word)
{
    int i = 0;

    // Create a pointer to the root of the trie
    node *ptr = root;

    // Iterate over each letter
    while (word[i] != '\0')
    {
        char c = tolower(word[i]);

        // Get the key for each letter
        int key = hash(c);

        // If the node at the key is null then word is misspelled
        if (!ptr)
        {
            return false;
        }
        else
        {
            ptr = ptr->children[key];
            i++;
        }
    }

    // Check if isword at the last letter is true
    if (ptr->is_word)
    {
        return true;
    }
    else
    {
        return false;
    }
}

error when input some words

我希望输出是FOUND或NOT FOUND,但是实际输出是分段错误。

2 个答案:

答案 0 :(得分:8)

您需要检查ptr是否不为null,因为如果您到达字符串的末尾并且不是单词中的单词,则将为空。
您也可以稍微压缩一下代码。

bool check(const char *word)
{
    const node * ptr = root;
    for (int i = 0; ptr != nullptr && word[i] != '\0'; i++)
    {
        ptr = ptr->children[hash(tolower(word[i]))];
    }
    return ptr != nullptr && ptr->is_word;
}

答案 1 :(得分:0)

ptr可能返回null

if ((ptr) && (ptr->is_word))
{
    return true;
}
else
{
    return false;
}