我遇到了一个无法解决的问题。我在子串中拆分了一个字符串,并将这些子串放在一个数组中。一切顺利,直到搜索功能结束。 strtok函数生成完美的子串,然后一切都很好地放在数组中,但是当函数结束时,数组丢失了所有的内容。我尝试过很多不同的东西,但似乎没什么用。当搜索功能结束并返回main时,我希望单词数组保留其内容。
int main(void)
{
char** words=NULL;
char argument[26] = "just+an+example";
search(argument, words);
}
search(char* argument, char** words)
{
char* p = strtok (argument, "+");
int n_spaces = 0;
while (p)
{
words = realloc(words, sizeof(char*)* ++n_spaces);
if (words == NULL)
exit(-1); // memory allocation failed
words[n_spaces-1] = p;
p = strtok(NULL, "+");
}
// realloc one extra element for the last NULL
words = realloc(words, sizeof(char*)* (n_spaces+1));
words[n_spaces] = 0;
}
答案 0 :(得分:1)
我猜你希望words
中的main
指向一个指向分隔符所在位置的指针数组。您需要将变量words
的地址传递给search
,并在search
内传递变量words
指向的内存。
试试这个:
int main(void)
{
char** words = NULL;
char argument[26] = "just+an+example";
search(argument, &words);
}
search(char* argument, char*** words)
{
char* p = strtok (argument, "+");
int n_spaces = 0;
while (p)
{
*words = realloc(*words, sizeof(char*) ++n_spaces);
if (*words == NULL)
exit(-1); // memory allocation failed
(*words)[n_spaces-1] = p;
p = strtok(NULL, "+");
}
// realloc one extra element for the last NULL
*words = realloc(words, sizeof(char*)* (n_spaces+1));
(*words)[n_spaces] = 0;
}
我根本没有检查search
中的逻辑,所以你可能还没有完成调试。
答案 1 :(得分:0)
我做错了几件事。首先在主函数中,当我调用搜索函数时,我必须通过我的数组的地址(& words)。我的第二个错误是不是复制子串本身而是复制了指向子串的指针。在函数结束时,这些指针被释放,因此我的数组在函数结束时丢失了他的内容。为了解决这个问题,每次我想将一个新字符串复制到我的数组并使用strcpy复制指针指向我的数组的字符串时,我必须使用malloc。
int main(void)
{
char** words = NULL;
char argument[26] = "just+an+example";
search(argument, &words);
}
search(char* argument, char*** words)
{
char* p = strtok (argument, "+");
int n_spaces = 0;
while (p)
{
*words = realloc(*words, sizeof(char*) ++n_spaces);
if (*words == NULL)
exit(-1); // memory allocation failed
(*words)[n_spaces - 1] = malloc(sizeof(char)* (strlen(p) + 1));
strcpy((*words)[n_spaces - 1], p);
p = strtok(NULL, "+");
}
}