0

我有一个这样格式化的简单文件

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循环显示所有三个具有相同名称的数组条目(第三个条目的值是正确的,但是对于第一个和第二个条目,值字段包含第三个条目正确值的一半)

谢谢!

4

1 回答 1

1

from 返回的值strtok()将指向 中的一个元素curLine,因此 s 数组中的所有条目struct都将指向一个元素curLine,每次调用都会覆盖该元素fgets()(并且仅对当前迭代有效)。

您应该复制从strtok()期间返回的值while,可能使用strdup()

while(fgets(curLine, sizeof curLine, stockFile) != NULL)
{   
    tempVal = strtok(curLine,"|");
    printf("i:%i\n",i);
    pairs[i].name = strdup(tempVal);
    printf("name at pos %i is %s\n",i, pairs[i].name);
    tempVal = strtok(NULL,"|");
    pairs[i].value = strdup(tempVal);
    printf("value at pos %i is %s\n",i, pairs[i].value);
    ++i;
}

free()以后不再需要时:

for (j = 0; j < 3; j++)
{
    free(pairs[j].name);
    free(pairs[j].value);
}
于 2012-05-15T16:34:09.773 回答