我已经连续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
。
现在真正令人困惑的行为是,在返回true
或false
之前,check()必须在屏幕上打印一些内容。 ...found ...
或... NOT found ...
。
好吧,不是。但是它仍然返回“ true”,这使我感到困惑。
有帮助吗? 我应该从两个文件中粘贴整个代码吗?
答案 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
每次都会发生(正如您所看到的,不必打印)。