我有一个简单的格式文件
NAME|VALUE
NAME|VALUE
NAME|VALUE
我试图读取这些,并将它们存储在一个结构数组中,结构就是这样
struct data
{
char* name;
char* value;
};
现在,我知道数组的大小将是3,所以我这样做了:
struct data pairs[3];
这是我的代码,因为我试图从文件中读取它:
char *tempVal;
int i =0;
if(file != NULL)
{
char curLine [128];
while(fgets(curLine, sizeof curLine, stockFile) != NULL)
{
tempVal = strtok(curLine,"|");
printf("i:%i\n",i);
pairs[i].name= tempVal;
printf("name at pos %i is %s\n",i, pairs[i].name);
tempVal = strtok(NULL,"|");
pairs[i].value= tempVal;
printf("value at pos %i is %s\n",i, pairs[i].value);
++i;
}
fclose(file);
}
并且每个printf语句都会打印出正确的东西,然后我尝试用这个打印数组
int j
for(j = 0; j < 3; j++)
{
printf("ENTRY# %i\NAME:%s\VALUE:%s\n\n",j,pairs[j].name, pairs[j].value);
}
对不起,缩进有点奇怪,尝试搞乱代码块,但无法让它完美 . 但是,我想知道为什么它在while循环中显示正确的东西,因为它继续,但是在它完成之后for循环显示所有三个具有相同名称的数组条目(该值对于第三个条目是正确的但是对于第一个和第二个条目,值字段包含第三个条目的正确值的一半)
谢谢!
1 回答
从
strtok()
返回的值将指向curLine
中的一个元素,因此struct
数组中的所有条目都将指向curLine
中的一个元素,该元素会在每次调用fgets()
时被覆盖(并且仅对当前迭代有效) .您应该在
while
期间复制strtok()
返回的值,可能使用strdup()
:free()
以后不再需要时: