Спеллер CS50: не распознавать неправильные слова - PullRequest
0 голосов
/ 06 мая 2020

Я сейчас работаю над функцией CS50 Speller. Мне удалось скомпилировать свой код и закончить прототип полной программы, однако он не работает (не распознает слова с ошибками). Я просматриваю свои функции по одной и распечатываю их вывод, чтобы посмотреть, что происходит внутри.

// Loads dictionary into memory, returning true if successful else false
bool load(const char *dictionary)
{
    char word[LENGTH + 1];
    int counter = 0;
    FILE *dicptr = fopen(dictionary, "r");

    if (dicptr == NULL)
    {
        printf("Could not open file\n");
        return 1;
    }

    while (fscanf(dicptr, "%s", word) != EOF)
    {
        printf("%s", word);
        node *n = malloc(sizeof(node));
        if (n == NULL)
        {
            unload();
            printf("Memory Error\n");
            return false;
        }

        strcpy(n->word, word);
        int h = hash(n->word);
        n->next = table[h];
        table[h] = n;
        amount++;

    }
    fclose(dicptr);
    return true;
}

Насколько я могу судить, это работает нормально. Это заставляет меня задаться вопросом, связана ли проблема с моей функцией проверки, как показано здесь:

bool check(const char *word)
{

    int n = strlen(word);

    char copy[n + 1];

    copy[n] = '\0';

    for(int i = 0; i < n; i++)
    {
        copy[i] = tolower(word[i]);
        printf("%c", copy[i]);
    }
    printf("\n");
    node *cursor = table[hash(copy)];
    while(cursor != NULL)
    {
        if(strcasecmp(cursor->word, word))
        {
            return true;
        }
        cursor = cursor->next;
    }

    return false;
}

Если кто-то с более зорким взглядом может проследить, в чем проблема, я был бы очень благодарен, поскольку я в тупике. Первая функция используется для загрузки слов из словаря в ha sh table \ связанный список. Вторая функция должна проверять слова текстового файла, чтобы увидеть, совпадают ли они с каким-либо термином в связанном списке. В противном случае их следует считать неправильными.

1 Ответ

1 голос
/ 06 мая 2020

Это if(strcasecmp(cursor->word, word)) проблема. From man strcasecmp :

Возвращаемое значение
Функции strcasecmp () и strncasecmp () возвращают целое число, меньшее, равное или большее чем ноль, если s1 (или его первые n байтов) соответственно меньше, совпадают или больше s2.

Если слова совпадают, он возвращает 0, что оценивается как ложь.

...