Функция Bool возвращает true без условия встречи - игнорирует printf () - PullRequest
0 голосов
/ 29 августа 2018

Я работаю 5 дней подряд над этой программой и не могу понять, почему она так себя ведет. Спасибо за помощь.

В файле speller.c есть код, который вызывает 4 функции в файле Dictionary.c
В speller.c он вызывает определенную функцию:

bool misspelled = !check(word);

Если слово с ошибкой имеет значение false, это означает, что функция проверки вернула значение true.

Вот функция проверки в dictionary.c:

bool check(const char *word)
{
    int key = hash(word);
    printf("Word: %s    position: %i\n", word, key);
    node* trav = dictArray[key];

    while (trav != NULL)
    {
        if(trav->word == word)
            printf("%s found in the dictionary\n", word);
            return true;
        trav = trav->next;
    }
    printf("%s NOT found in the dictionary\n", word);
    return false;

Check () будет проверять хеш-таблицу, сможет ли она найти слово, переданное в качестве аргумента в хеш-таблице, и напечатает каждое слово и его ключ. Если он его находит, он печатает сообщение и возвращает true. Если нет, то печатает сообщение о том, что так, и возвращает false. Хеш-таблица представляет собой массив из 26 элементов, каждый из которых представляет собой структуру с 2 элементами, один из которых является строкой, а другой - указателем на следующую структуру (узел) в списке. Узлы добавляются в списки в зависимости от первой буквы слова.

Проблема в том, что я проверил каждое слово, добавляемое в массив, и даже когда этого слова нет, функция все равно возвращает true. Фактически, он возвращает true для каждого слова, переданного в качестве аргумента.

Теперь действительно загадочное поведение заключается в том, что check () должен что-то напечатать на экран, перед возвратом либо true или false. Либо ...found ..., либо ... NOT found .... Ну, это не так. Но он все равно возвращает «true», что меня смущает.

Любая помощь? Должен ли я вставить весь код из обоих файлов?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Присмотритесь:

while (trav != NULL)
{
    if(trav->word == word)
        printf("%s found in the dictionary\n", word);
        return true;
    trav = trav->next;
}

Вокруг блока if нет фигурных скобок. Итак, при правильном отступе у вас действительно есть:

while (trav != NULL)
{
    if(trav->word == word)
        printf("%s found in the dictionary\n", word);
    return true;
    trav = trav->next;
}

Таким образом, вы всегда возвращаете true на первой итерации цикла.

Кроме того, вы не хотите использовать == для сравнения строк. В конечном итоге вы сравниваете значения указателя , которые почти всегда не будут равны. Используйте strcmp для сравнения строк.

Фиксированный код:

while (trav != NULL)
{
    if(!strcmp(trav->word, word)) {
        printf("%s found in the dictionary\n", word);
        return true;
    }
    trav = trav->next;
}
0 голосов
/ 29 августа 2018

Этот блок кода:

    if(trav->word == word)
        printf("%s found in the dictionary\n", word);
        return true;

Не делает то, что вы думаете - добавьте {} вокруг всего, что вы хотите включить в оператор if:

if(trav->word == word) 
{
    printf("%s found in the dictionary\n", word);
    return true;
}

В противном случае return true происходит каждый раз (и, как вы видели, без обязательной печати).

...