Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将递归函数中的多个字符串存储到结构c中_C_String_Recursion_Struct_Trie - Fatal编程技术网

将递归函数中的多个字符串存储到结构c中

将递归函数中的多个字符串存储到结构c中,c,string,recursion,struct,trie,C,String,Recursion,Struct,Trie,我正在制作一个预测文本界面,通过该界面,我将字典存储到一个数据结构中(我使用了trie),用户搜索部分单词,完成的单词显示为每个单词对应的数字。我已经完成了插入、搜索功能,并进行了递归遍历,打印出所有已完成的单词(没有数字)。但是,我想将它们存储到一个结构中,这样我就可以在另一个函数中使用它们,在这个函数中,用户将看到带有相应数字的单词 下面是主要的.c代码(用于测试它不会进入所有25000字的readfile!): pntr设置为部分单词结束的节点,遍历将在该节点搜索单词的其余部分 下面是我的

我正在制作一个预测文本界面,通过该界面,我将字典存储到一个数据结构中(我使用了trie),用户搜索部分单词,完成的单词显示为每个单词对应的数字。我已经完成了插入、搜索功能,并进行了递归遍历,打印出所有已完成的单词(没有数字)。但是,我想将它们存储到一个结构中,这样我就可以在另一个函数中使用它们,在这个函数中,用户将看到带有相应数字的单词

下面是主要的.c代码(用于测试它不会进入所有25000字的readfile!):

pntr设置为部分单词结束的节点,遍历将在该节点搜索单词的其余部分

下面是我的递归遍历及其调用程序:

void traverseTwo(struct TrieNode* node, char* partialWord)
{
    char arr[50];
    int index = 0;

    int maxWordSize = 100;
    char wordArr[50][maxWordSize];

    index = recursivePrint(node->children, arr, wordArr[50], 0, partialWord, index);

    int i = 0;

    for(i = 0; i < index; i++)
         printf("%d: %s\n", i, wordArr[i]);

    printf("%d: Continue Typing", index);
}

 int recursivePrint(struct TrieNode* node, char* arr, char* wordArr, int level, char* partialWord, int index)
{
     if(node != NULL)
     {
          arr[level] = node->symbol;

         index = recursivePrint(node->children, arr, wordArr, level+1, partialWord, index);

         if(node->symbol == '\0')
             index = completeWordAndStore(partialWord, arr, wordArr, index);

        index = recursivePrint(node->sibling, arr, wordArr, level, partialWord, index);
    }
    return index;
}

int completeWordAndStore(char* partialWord, char* restOfWord, char* wordArr, int index)
{
    int length = strlen(partialWord) + strlen(restOfWord);
    char completeWord[length];

    strcpy(completeWord, partialWord);
    strcat(completeWord, restOfWord);

    strcpy(wordArr[index], completeWord);

    index++;

    return index;
}
void traverseTwo(结构三节点*节点,字符*部分字)
{
char-arr[50];
int指数=0;
int maxWordSize=100;
char-wordArr[50][maxWordSize];
index=recursivePrint(节点->子节点,arr,wordArr[50],0,partialWord,index);
int i=0;
对于(i=0;i符号;
index=recursivePrint(节点->子节点,arr,wordArr,level+1,partialWord,index);
如果(节点->符号=='\0')
索引=completeWordAndStore(partialWord,arr,wordArr,index);
index=recursivePrint(节点->同级,arr,wordArr,level,partialWord,index);
}
收益指数;
}
int completeWordAndStore(char*partialWord,char*restOfWord,char*wordArr,int index)
{
int-length=strlen(partialWord)+strlen(restOfWord);
字符完整字[长度];
strcpy(完整词、部分词);
strcat(completeWord,restOfWord);
strcpy(wordArr[index],completeWord);
索引++;
收益指数;
}
我在strcpy(wordArr[index],completeWord)上遇到一个分段错误

我的想法是,一旦它进入if语句,其中nodes符号为“\0”,它就会将字符串存储在index的值处

partial word是在ee.g“aba”中搜索到的部分单词,我会将它与arr组合并存储到结构中

结果应产生:

0:大吃一惊 1:算盘 2:鲍鱼 3:放弃 4:贬低 5:不好意思 6:减弱 7:减弱器 8:继续打字

稍后我确实调用了析构函数,但这肯定是经过尝试和测试的

有人能建议如何修改它,以便我可以存储字符串吗

如果我是正确的,我还假设它将是一个数组结构

非常感谢

杰克

你没有为你的单词分配任何内存。尝试:

int maxWordSize = 100;
char wordArr[50][maxWordSize];

它可以是任何东西,从链表到哈希表等等。。。取决于您的用例。既然您说您已经完成了插入部分,那么在理想情况下,您将在容器数据结构中插入单词。@SelçukCihan我只能使用1个数据结构。im使用trie时,插入用于将符号放入节点处的trie中。搜索一个对等词后,我需要存储遍历中的其余词,并在另一个函数中使用它来显示给用户,以便他们可以选择自己的词…哦,我明白了,您希望将以给定搜索关键字开头的完整词存储在另一个位置。因为您将允许用户选择,所以这不应该是一个很长的列表,因此您可以使用一个固定大小的字符串数组(即char*数组)。要快速尝试,只需在递归打印中再添加两个参数:第一个参数是存储字符串的数组本身,第二个参数是该数组的索引。第二个参数将由递归调用修改,因此将其作为指向int的指针,并在每次插入后增加其值。@SelçukCihan非常感谢,我当然只想在到达“\0”节点时增加第二个参数???当你说char*数组时,你是指char*arr[]??很抱歉,这些问题对我来说不是很自然,所以我有时很难回答understand@SelçukCihan我已经按照你说的做了,但是我必须不使用int*否则我会得到警告,并且我会在strcpy(wordArr[index],completeWord)上不断得到seg错误行谢谢你的帮助,我已经更新了上面的代码,它现在可以打印0到8,但不是打印空白或随机符号的单词。。。我的实现是否正确???@Jack它是
wordArr[50][maxWordSize][code>而不是
wordArr[maxWordSize][50]
谢谢,恐怕它仍然无法正确打印。。。我是否正确地传入函数??
strcpy(&(wordArr[index]),completeWord)=>否
&
wordArr[index]
是正确的目标。好的,我现在收到一条警告,我正在从strcpy的第一个参数中的整数生成指针,当我运行
strcpy(wordArr[index],completeWord)时,我得到一个分段错误
char* wordArr[50];
int maxWordSize = 100;
char wordArr[50][maxWordSize];