gpt4 book ai didi

c - 访问在指向 strtok 的字符数组的指针中传递的变量时获取不正确的值

转载 作者:太空狗 更新时间:2023-10-29 15:03:49 26 4
gpt4 key购买 nike

这是我的代码

//Split up the config by lines
int x;
int numberOfConfigLines = 0;
for (x = 0; x < strlen(buffer); x++)
{
if (buffer[x] == '\n') {
numberOfConfigLines++;
}
}
char *configLines[numberOfConfigLines];
tokenize(configLines, buffer, "\n", numberOfConfigLines);

这个函数的想法是计算缓冲区中换行符的数量,然后使用这个将缓冲区拆分成一个 strtok 数组:

#include <string.h>
#include <stdlib.h>

void tokenize(char **arrToStoreTokens, char *delimitedString, char *delimiter, int expectedTokenArraySize) {
//Create a clone of the original string to prevent making permanent changes to it
char *tempString = (char *)malloc(strlen(delimitedString) + 1);
strcpy(tempString, delimitedString);

if (expectedTokenArraySize >= 1) {
arrToStoreTokens[0] = strtok(tempString, delimiter);

int x;
for (x = 1; x < expectedTokenArraySize; x++ ) {
arrToStoreTokens[x] = strtok(NULL, delimiter);
}
}

//Dispose of temporary clone
free(tempString);
}

如果我直接访问 arrToStoreTokens[0],我会得到正确的结果,但是当我尝试访问 configLines[0] 时,一旦 tokenize 函数已经结束,我得到了不同的结果(可以是未知字符或者只是空的)

此外,我相信这只是在我开始以 root 身份运行程序(出于不同的要求)后才开始发生 - 虽然我可能错了。 - 编辑:确认不是问题所在。

有什么想法吗?

最佳答案

strtok不重新分配任何东西。它只会对您提供给它的内容进行切割和指示。

您的数组存储 strtok 给您的指针,但不要复制内容。

因此,如果您释放 tempString 变量,您就释放了由 strtok 的返回值指向的数据。您必须保留它并仅在最后释放它。

或者你可以制作一个strdup strtok 的每次返回将其存储在您的数组中以制作每个标记的真实副本,但在这种情况下,您必须在最后释放每个标记。

第二种解决方案如下所示:

void tokenize(char **arrToStoreTokens, char *delimitedString, char *delimiter, int expectedTokenArraySize) {
//Create a clone of the original string to prevent making permanent changes to it
char *tempString = (char *)malloc(strlen(delimitedString) + 1);
strcpy(tempString, delimitedString);

if (expectedTokenArraySize >= 1) {
arrToStoreTokens[0] = strdup(strtok(tempString, delimiter)); // Here is the new part : strdup

int x;
for (x = 1; x < expectedTokenArraySize; x++ ) {
arrToStoreTokens[x] = strdup(strtok(NULL, delimiter)); // Here is the new part : strdup
}
}

//Dispose of temporary clone
free(tempString);
}

在使用这个数组之后,你必须删除它,使用如下函数:

void deleteTokens(char **arrToStoreTokens, int arraySize)
{
int x;
for (x = 0; x < arraySize; ++x)
{
free(arrToStoreTokens[x]);
}
}

关于c - 访问在指向 strtok 的字符数组的指针中传递的变量时获取不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29558652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com