有一个问题,如何将结构保存到数组并在main()
中打印出来。
我的想法是,获取.txt的数据,然后将其保存在struct数组中。如果我直接用printf()
输出它,效果很好。
但是,如果我想将其保存在结构数组 中并将其打印出 at the
main(),则会出现垃圾值,什么也不会,或者只有最后读取的结构会保存到数组的所有位置。
我的代码如下:
typedef struct CAR {
char* nickname;
char* model;
} CAR;
void getInputFromFile(struct CAR *arr) {
. . .
. . .
char *nickname = malloc(...);
char *model = malloc(...);
int i=0;
while(fscanf(file,"%s %s\n", model, nickname)==2){
printf("%s %s\n", model, nickname); // this works fine!!!
// Now when i try to save it in a struct it doesn't work
arr[i]->model = model;
arr[i]->nickname = nickname;
i++;
}
free(nickname);
free(model);
}
int main (){
struct CAR* arr[size];
getInput(arr);
// Now iterate over arr to look at values
for(i = 0; i < size; i++){
...
}
}
文件输入格式如下:
nickname model\n
nickname model\n
...
感谢您的所有帮助!
答案 0 :(得分:2)
在将每个字符串放入结构之前,您必须复制(strdup)每个字符串
arr[i]->model = strdup(model);
arr[i]->nickname = strdup(nickname);
当前所有 ar []->模型指向相同的存储区,并且释放了一个存储区,所有 arr []->昵称 >
在您的程序中,您忘记了还要分配每个CAR,因此实际上:
arr[i] = (CAR *) malloc(sizeof(CAR));
arr[i]->model = strdup(model);
arr[i]->nickname = strdup(nickname);
答案 1 :(得分:1)
每个结构都需要为字符串分配内存。当前,您只有一个用于昵称和模型的字符串缓冲区(因此被覆盖),并在循环结束时释放它,因此现在每个结构都指向释放的内存,而不是原始的字符串。