gpt4 book ai didi

c - 之前存储的字符串会被 fget 覆盖

转载 作者:行者123 更新时间:2023-11-30 18:48:45 24 4
gpt4 key购买 nike

我正在使用 fgets() 从 CSV 文件中读取记录,一次读取一行,并使用 strtok() 解析每一行中的字段。我遇到一个问题,即 fgets() 覆盖以前写入的字符串,以支持新字符串。
下面是我的意思的一个例子:

record.csv(这是我正在读取的文件)

John,18
Johann,29

main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct customer {
char *name;
int age;
} Customer;

int main(void)
{
FILE *csv_data;
char line[100], *token;
Customer newData[2];

csv_data = fopen("record.csv", "r");
// Index 0 for John's data, index 1 for Johann's data
int i = 0;

/* loops until end of file */
while(fgets(line, 100, csv_data)) {

/* name field */
token = strtok(line, ",");
if (token != NULL) {
newData[i].name = token;
}

/* age field */
token = strtok(NULL, ",");
if (token != NULL) {
// atoi() converts ascii char to integer
newData[i].age = atoi(token);
}
i++;
}
/* print John's records */
printf("%s\n", newData[0].name);
printf("%d\n", newData[0].age);

/* print Johann's records */
printf("%s\n", newData[1].name);
printf("%d\n", newData[1].age);

return 0;
}


当我们编译并执行它时,它会打印出:

Johann
18
Johann
29

“约翰”在 newData[0].namewhile 的第二次迭代期间被“Johann”覆盖环形。但请注意,只有字符串会被混淆,而整数不会被混淆。我怀疑这与fgets有关因为当我将上面的源修改为仅运行 fgets 时有一次,“John”的输出就如其应有的那样。
也许我误用了fgets (或者也许我的假设是错误的),但是有人可以给我一些关于为什么每次调用fgets时字符串被覆盖的指示吗? ?

第二次更新:再次非常感谢所有评论者和回答者。很高兴知道那些我不知道的事情。源现在工作完美。

最佳答案

您不是复制字符串,而是复制指向该字符串的指针。

复制字符串的一种非常简单的方法,但请注意,这将字符串的大小限制为 99 个字符。

typedef struct customer {
char name[100];
int age;
} Customer;

strcpy(newData[i].name, token);

关于c - 之前存储的字符串会被 fget 覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44790786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com