【发布时间】: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() 必须在返回 true 或 false 之前将某些内容打印到屏幕上。 ...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