我希望我不会因此迅速投票,但我有一个项目,我正在上学,我必须建立一个拼写检查器。我决定使用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;
}
但我一直无法找到它。该项目的其余部分可以在
找到答案 0 :(得分:2)
在循环之外声明你的word[LENGTH]
数组,否则它将丢弃word
指针并在每个循环结束时释放分配,创建一个新的。我认为你不希望这样,我认为只有当if
条件没有得到满足时你才会想要它。
我可能不知道trieWordInsert
做了什么,但我会假设您需要0
终结符。
word[LENGTH] = { 0 };
for( ... ) { ... }
memset( word, 0, LENGTH);
区块内添加else
memory.h
包括string.h
或memset
这应该是它,我想......
修改:了解了trieWordInsert
或多或少的问题导致word
被推入...
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
并逐字阅读文件。