Speller为某些词而不是其他词工作。不知道问题出在哪里

时间:2019-07-27 06:17:38

标签: c hashtable singly-linked-list cs50

我是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),则按预期显示。任何定制的词典,都会将一些正确的单词显示为拼写错误的单词。

1 个答案:

答案 0 :(得分:0)

来自man strcmp [已添加重点]:

  

返回值
         strcmp()和strncmp()函数返回小于,等于或小于的整数          如果分别找到s1(或其前n个字节),则大于零          小于,匹配或大于s2。

您可以通过debug50制作一个小型的定制字典,然后看看这行会发生什么:
 if (strcmp(chk->word, word))

由于strcmp返回了int,因此请像int而不是bool一样对其进行测试。而且请不要忘记:检查器应区分大小写!