指针在struct数组中替换自己

时间:2013-07-14 23:02:44

标签: c arrays pointers struct

好的,所以我有这个代码从文件中提取各种东西

while(fgets(buffer, sizeof(buffer), fp) !=NULL)
{
    name = strtok(buffer,del);
    class=strtok(NULL,del);
    grade = atoi(strtok(NULL,del));


    d[counter].name=name;
    d[counter].course=class;
    d[counter].grade=grade;
    printf("%s    %s     %d\n",d[counter].name,d[counter].course,d[counter].grade);
    counter++;
}

现在的问题是,每当检索到strtok的新标记时,它都会替换struct数组中的先前值。

我已经把它缩小到这个块有问题了:

d[counter].name=name;
d[counter].course=class;

它似乎指向每次strtok返回一个新值时重写的相同内存块,因此结构中的所有指针都指向该1个对象。

这是我的结构:

struct student {
char *name;
char *course;
int grade;

};

现在我的问题是,无论如何将strtok值放入单独的内存地址,这样它们就不会将所有内容都指向一个位置并替换自己?

Strdup,malloc和memmove不适合我。

为了更清楚地表示正在发生的事情,这里是原油预期产出

Tom    Phys 1444   54
Joe    CSE 1310   95
Alex   Chem 2315   86
Tim    Span 1443   81

现在这是我得到的输出

Tim  Span 1443  54
Tim  Span 1443  95
Tim  Span 1443  86
Tim  Span 1443  81

1 个答案:

答案 0 :(得分:1)

问题是每次调用fgets时都会覆盖一个缓冲区,而对strtok的调用只是返回指向该缓冲区的指针。

如果您不允许使用strdup之类的内容来复制从strtok调用返回的字符串,那么我建议您只使用多个缓冲区。

例如,如果您的缓冲区当前声明为:

char buffer[256];

您可以将20个缓冲区声明为:

char buffer[20][256];

其中20应至少与 d 数组中的项目数一样大。

然后,您对fgets的调用应该根据计数器在循环的每次迭代中读入不同的缓冲区。

fgets(buffer[counter], sizeof(buffer[counter]), fp)

同样,您对strtok的调用应该引用相应的缓冲区。

name = strtok(buffer[counter],del);