我是CS50问题集4,拼写器,哈希表版本。
代码可以正确检测字典和文本中的单词数。但是,它拼写错误。
// Loads dictionary
bool load(const char *dictionary)
{
// Initialize hash table
for (int i = 0; i < N; i++)
{
hashtable[i] = NULL;
}
// Open dictionary
FILE *file = fopen(dictionary, "r");
if (file == NULL)
{
unload();
return false;
}
// Buffer for a word
char word[LENGTH + 1];
// Insert words into hash table
while (fscanf(file, "%s", word) != EOF)
{
node *new_node = malloc(sizeof(node));
int j = hash(word);
// check if out of memory
if (new_node == NULL)
{
unload();
return false;
}
else
{
strcpy(new_node->word, word);
new_node->next = hashtable[j];
hashtable[j] = new_node;
}
}
}
fclose(file);
return true;
}
// Returns number of words in dictionary if loaded
{
unsigned int count = 0;
for(int i = 0; i < 26; i++)
{
node *cursor = hashtable[i];
while (cursor != NULL)
{
cursor = cursor->next;
count++;
}
}
return count;
}
// Returns true if word is in dictionary else false
bool check(const char *word)
{
int i = hash(word);
node *chk = hashtable[i];
while (chk != NULL)
{
if (strcmp(chk->word, word))
{
return true;
}
chk = chk->next;
}
return false;
}
// Unloads dictionary from memory, returning true if successful else false
bool unload(void)
{
// TODO
for (int i = 0; i < N; i++)
{
node *cursor = hashtable[i];
while (cursor != NULL)
{
node *temp = cursor;
cursor = cursor->next;
free(temp);
}
}
return true;
}
如果选择了大词典,则拼写错误的单词始终为0(无论文本是什么),如果选择了小词典(使用cat.txt),则该单词将按预期显示。任何定制的词典都将一些正确的单词显示为拼写错误的单词。
最佳答案
从man strcmp
[添加重点]:
返回值
strcmp()和strncmp()函数返回小于,等于或等于的整数
如果分别找到s1(或其前n个字节),则大于零
小于,匹配或大于s2。
您可以通过debug50制作一个小型的定制字典,然后看看这行会发生什么:
if (strcmp(chk->word, word))
由于strcmp
返回int
,因此请像int
而不是bool
一样对其进行测试。而且请不要忘记:检查器应不区分大小写!
关于c - Speller为某些词而不是其他词工作。不知道问题出在哪里,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57229671/