【问题标题】:Bool function returns true without meeting condition - ignores printf()Bool 函数在不满足条件的情况下返回 true - 忽略 printf()
【发布时间】:2019-02-03 17:28:36
【问题描述】:

我在这个程序上连续工作了 5 天,但不知道为什么会这样。感谢您帮助我。

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

bool misspelled = !check(word);

如果拼写错误为假,则表示检查函数返回真。

这里是检查函数,在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() 必须在返回 truefalse 之前将某些内容打印到屏幕上。 ...found ...... NOT found ...。 好吧,它没有。但它仍然返回'true',这让我感到困惑。

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

【问题讨论】:

  • @Deanie C 自 1999 年标准以来就具有布尔类型。 en.cppreference.com/w/c/types/boolean
  • 也许你错误地认为return true;if 条件的一部分?
  • 您是否尝试使用== 比较不同的字符串?此外,您的函数总是在第一次通过该 while 循环时返回 true。 (至少现代版本的 gcc 会警告您不要混淆缩进)
  • if(trav->word == word) 看起来很可疑。这不是您比较字符串的方式,除非您当然可以保证系统中每个唯一的“单词”都有一个唯一的指针。
  • 这就是为什么样式指南几乎普遍坚持所有条件和循环体都是大括号包围的块。至少在你学习的时候,遵循这样的风格指南是值得的。 (你可能会喜欢它)。此外,总是 要求编译器警告您有问题的构造。如今,许多编译器会识别出错误缩进的代码,例如您的代码,并警告您注意缩进误导。

标签: c return boolean printf conditional-statements


【解决方案1】:

仔细看:

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

【讨论】:

  • 非常感谢。在添加了一行进行调试后,我忘记了添加花括号。关于 strcmp,我完全忘记了该函数以及比较字符串如何不适用于 ==。干杯
  • @PYB 这就是为什么你应该总是使用花括号作为内部块,即使它只有一行。
【解决方案2】:

这个代码块:

    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 每次都会发生(如您所见,不一定要打印)。

【讨论】:

    猜你喜欢
    • 2021-09-01
    • 2021-05-03
    • 1970-01-01
    • 2021-04-22
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多