Почему некоторые слова дают ошибку сегментации?В то время как другие, кажется, работают нормально - PullRequest
0 голосов
/ 11 февраля 2019

Создание словаря с использованием дерева в 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

Я ожидаю, что выход будет НАЙДЕН или НЕ НАЙДЕН, но фактический выход - ошибка ошибки сегментации.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Вам нужно проверить, что ptr не равно нулю, поскольку это произойдет, если вы достигнете конца строки, и это не слово в вашем дереве.
Вы также можете немного сжать код.

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;
}
0 голосов
/ 11 февраля 2019

Возможно, что ptr возвращает null.

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