将指针从strtok分配到2d结构数组中的指针,所有条目应该是唯一的,但打印出来是相同的

时间:2015-07-08 17:22:03

标签: c arrays pointers strtok

将指针从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++;
      } 
 }

2 个答案:

答案 0 :(得分:1)

在您的代码中,所有str基本上都是tokPtr占位符。所有这些都只指向tokPtr。现在,在完成while()循环后,所有 tokPtr s还会保留str所持有的最新值。

要避免,您需要

  1. 为每个str分配内存,可能使用malloc()
  2. 使用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;