布尔函数返回true而不满足条件-忽略printf()

时间:2018-08-29 02:39:59

标签: c return boolean printf conditional-statements

我已经连续5天从事此程序的工作,无法弄清楚它为什么会这样工作。感谢您的帮助。

speller.c文件中有代码调用文件字典中的4个函数。c
在speller.c中,它调用某个函数:

bool misspelled = !check(word);

如果拼写错误为false,则表示检查功能返回true。

这是字典中的检查功能。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

现在真正令人困惑的行为是,在返回truefalse之前,check()必须在屏幕上打印一些内容。 ...found ...... NOT found ...。 好吧,不是。但是它仍然返回“ true”,这使我感到困惑。

有帮助吗? 我应该从两个文件中粘贴整个代码吗?

2 个答案:

答案 0 :(得分:4)

仔细观察:

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;
}

答案 1 :(得分:1)

此代码块:

    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每次都会发生(正如您所看到的,不必打印)。