fgetc()没有像我希望的那样工作

时间:2014-03-09 18:19:14

标签: c trie 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 :(得分:2)

在循环之外声明你的word[LENGTH]数组,否则它将丢弃word指针并在每个循环结束时释放分配,创建一个新的。我认为你不希望这样,我认为只有当if条件没有得到满足时你才会想要它。

我可能不知道trieWordInsert做了什么,但我会假设您需要0终结符。

  • word[LENGTH] = { 0 };
  • 之前声明for( ... ) { ... }
  • memset( word, 0, LENGTH);区块内添加else
  • 如果您尚未包含其中任何一个,请memory.h包括string.hmemset

这应该是它,我想......

修改:了解了trieWordInsert或多或少的问题导致word被推入...

EZ模式的直接代码:

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;
}

答案 1 :(得分:1)

我认为你并没有以'\ 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并逐字阅读文件。