fgetc() не работает, как я надеялся

Надеюсь, меня за это быстро не проголосуют, но у меня есть проект, над которым я работаю для школы, в котором я должен создать программу проверки орфографии. Я решил использовать Trie, и это, кажется, работает, но у меня есть ошибка, которую я не могу найти. Я думаю, что проблема заключается в следующем,

bool load(const char* dictionary)
{

    if (!rootNode)
    {
        rootNode = trieNodeCreate();
        if (!rootNode)
        {
            printf("could not allocate root node");
            return false;
        }
    }

    // Open the file 
    FILE* fp = fopen(dictionary, "r");

    if (fp == NULL)
    {
        printf("could not open dictioanry %s\n", dictionary);
        return false;
    }


    int index = 0;
    for (int c = fgetc(fp); c != EOF; c = fgetc(fp))
    {
        char word[LENGTH];
        if (c != '\n' )
        {
            word[index] = c;
            index++;
        }
        else
        {
            trieWordInsert(word, rootNode);
            index = 0;
                wordCount ++;

        } 

    }
    fclose(fp);

    if (wordCount)
    {
        return true;
    }
    return false;
}

но я не смог его найти. Остальную часть проекта можно найти на

https://github.com/iMillJoe/spell-checker

2 ответа

Решение

Я думаю, что вы не заканчивали слово "\0"

char word[LENGTH];
 if (c != '\n' )
 {
     word[index] = c;
     index++;
 }
 else
 {
     word[index] = '\0'; //missing this one!!!
     trieWordInsert(word, rootNode);
     index = 0;
     wordCount ++;
 } 

Я думаю тебе лучше использовать fscanf и прочитайте файл слово за словом.

Объявите свой word[LENGTH] массив вне цикла, иначе он просто отбросит word указатель и освободить выделенное в конце каждого цикла, создать новый. Я не думаю, что вы хотите этого, я думаю, что вы хотели бы этого только тогда, когда if условие не выполняется.

Может я не знаю что trieWordInsert делает, но я буду считать, что вам понадобится 0 терминатор.

  • декларировать word[LENGTH] = { 0 }; прямо перед for( ... ) { ... }
  • Добавить memset( word, 0, LENGTH); внутри else заблокировать там
  • Включают memory.h или же string.h для memset если вы еще не включили ни одного из них

И это должно быть, я думаю...

Изменить: после того, как узнал, как trieWordInsert более или менее выдает word толкнул в...

ПРЯМОЙ КОД ДЛЯ EZ MODE:

bool load( const char* dictionary )
{

    if ( !rootNode )
    {
        rootNode = trieNodeCreate( );
        if ( !rootNode )
        {
            printf( "could not allocate root node" );
            return false;
        }
    }

    // Open the file 
    FILE* fp = fopen( dictionary, "r" );

    if ( fp == NULL )
    {
        printf( "could not open dictioanry %s\n", dictionary );
        return false;
    }

    int index = 0;
    char word[LENGTH];
    for ( int c = fgetc( fp ); c != EOF; c = fgetc( fp ) )
    {
        if ( c != '\n' )
        {
            word[index] = c;
            index++;
        }
        else
        {
            word[index] = 0;
            trieWordInsert( word, rootNode );
            index = 0;
            wordCount++;
        }

    }
    fclose( fp );

    if ( wordCount )
    {
        return true;
    }
    return false;
}
Другие вопросы по тегам