CS50 pset5 SPELLER-最基本的单词和子字符串问题

时间:2020-06-23 01:21:15

标签: cs50

我已经在pset5中停留了一段时间。无论从哪个角度看待我的代码,我都无法找出问题所在。我将水桶数量随机设置为1000。有人可以找出问题所在吗?

以下是我从check50得到的回复 :) dictionary.c,dictionary.h和Makefile存在 :)拼写器编译 :(可以正确处理最基本的单词 应为“ MISSPELLED WOR ...”,而不是“ MISSPELLED WOR ...” :)处理最小长度(1个字符)的单词 :)处理最大长度(45个字符)的单词 :)正确处理带有撇号的单词 :)拼写检查不区分大小写 :(正确处理子字符串 应为“ MISSPELLED WOR ...”,而不是“ MISSPELLED WOR ...” :|程序没有内存错误 直到皱着眉头,才能检查

这些是我所做的:

const unsigned int N = 1000;

// Returns true if word is in dictionary else false
bool check(const char *word)
{
    //convert *word to lowercase so that the hash function is case-insensitive
    int length = strlen(word);
    char copy[length + 1];
    for (int i = 0; i < length; i++)
    {
        copy[i] = tolower(word[i]);
    }

    // create a variable to return hashed value of word
    int index_check = hash(copy);

    //create cursor to traverse the linked list
    node *cursor = table[index_check];

    //check if word is in the linked list
    while (cursor != NULL)
    {
        if (strcasecmp(word, cursor->word) == 0)
        {
            return true;
        }
        cursor = cursor->next;
    }

    //return false if cursor->next = NULL has been reached
    return false;
}

// Hashes word into a number
unsigned int hash(const char *word)
{
    // Source of hash function: stackoverflow.com/questions/14409466/simple-hash-functions
    unsigned int count;
    unsigned int hashValue = 0;
    for(count = 0; word[count] != '\0'; count++)
    {
        hashValue = word[count] + (hashValue << 6) + (hashValue << 16) - hashValue;
    }
    return (hashValue % N);
}

// Loads dictionary into memory, returning true if successful else false
bool load(const char *dictionary)
{
    // open dictionary file
    FILE *f = fopen(dictionary, "r");
    if (f == NULL)
    {
        printf("Dictionary could not be opened\n");
        return false;
    }

    //initialize string as a buffer, to be used in next function, fscanf
    char buffer[LENGTH + 1];

    //loop to check whether end of file has been reached
    while (fscanf(f, "%s", buffer) != EOF)
    {
        //read words from file into buffer
        fscanf(f, "%s", buffer);

        //allocate memory for a node and check if NULL
        node *n = malloc(sizeof(node));
        if (n == NULL)
        {
            printf("Could not allocate memmory (malloc *n)\n");
            return false;
        }

        //copy "buffer" into the node created
        strcpy(n->word, buffer);

        //call hash function
        int index = hash(buffer);

        //check if it's the first word being inserted into that bucket
        if (table[index] == NULL)
        {
            table[index] = n;
        }
        else
        {
            n->next = table[index];
            table[index] = n;
        }
    size_dictionary++;
    }
    fclose(f);
    return true;
}
  
// Unloads dictionary from memory, returning true if successful else false
bool unload(void)
{
   node *cursor;
   node *tmp;

    // run thru all buckets
    for(int i = 0; i < N; i++)
    {
        //check if bucket isn't NULL
        if(table[i] != NULL)
        {
            cursor = table[i];
            tmp = cursor;
            while (tmp != NULL)
            {
                cursor = cursor->next;
                free(tmp);
                tmp = cursor;
            }
        }
    }
    return true;
}

1 个答案:

答案 0 :(得分:0)

线索在词典中的单词中。仅加载字典中一半的单词。这是因为负载{@ 1}背对背。