将指针从strtok()
分配到结构中包含的ptr
。我有一个这样的结构的二维数组,我想用来存储我试图从csv文件解析的数据。
typedef struct Entry
{
char *str;
} Entry;
我正在从fgets()
获取输出并通过我自己的函数TokenizeLine()
发送它,以便将其拆分并将其分配到数组中的正确位置。但是,我的2d数组(etable
)的每个条目中的每个指针最终都保持相同的值。
以下代码有什么问题?
fgets(currentLineStr, 8192, fileIn);
while (currentLineStr[0] == '#')
fgets(currentLineStr, 8192, fileIn);
TokenizeLine(currentLineStr, eTable, yIndex, x, y);
yIndex++;
while(fgets(currentLineStr, 8192, fileIn) != NULL)
{
TokenizeLine(currentLineStr, eTable, yIndex, x, y);
yIndex++;
}
void TokenizeLine(int x; int y; char currentLineStr[], Entry eTable[x][y], int yIndex, int x, int y)
{
char *tokPtr;
int xIndex = 0;
tokPtr = strtok(currentLineStr, "|");
while(tokPtr != NULL)
{
eTable[xIndex][yIndex].str = tokPtr;
tokPtr = strtok(NULL, "|");
xIndex++;
}
}
答案 0 :(得分:1)
在您的代码中,所有str
基本上都是tokPtr
的占位符。所有这些都只指向tokPtr
。现在,在完成while()
循环后,所有 tokPtr
s还会保留str
所持有的最新值。
要避免,您需要
str
分配内存,可能使用malloc()
。strcpy()
将<{em}}的当前值复制到相应的tokPtr
。答案 1 :(得分:0)
正如EOF在评论中写道,您重用缓冲区currentLineStr
。每次拨打fgets
时,您都会覆盖用于所有前一行的存储空间,包括每个str
指向的内存。这是因为strtok
会将指针返回到您第一次给它的字符串中。
Sourav Ghosh的解决方案有效,因为它会在遇到共享缓冲区时复制每个令牌(返回指向副本的指针)。另一个可行的解决方案是malloc()
在您调用currentLineStr
的循环内fgets()
的空格。
顺便说一句,我建议你不要这样做:
typedef struct Entry {...} Entry;
C ++是另一种语言。要么不使用typedef并将其命名为&#34; struct Entry&#34;,要么在没有struct标签的情况下输入它:
typedef struct {...} Entry;
C标准库中有一个约定,即typedef名称以_t结尾,所以你也可以这样做(或者选择一个对你有意义的命名约定):
typedef struct Entry {...} Entry_t;