好的,所以我有这个代码从文件中提取各种东西
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
答案 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);