我最近一直在用C语言编写RPG,而且我遇到了一些从文本文件中保存/加载某些数据的困难。
以下是(简化为简短)代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct player{
int id;
char* name;
};
void save(struct player* player)
{
FILE* fp = 0;
char* buffer = 0;
fp = fopen("./gamesave.txt", "w");
fclose(fp);
buffer = malloc(80);
memset(buffer, 0, 80);
snprintf( buffer, 80, "%d|%s|\n", player->id, player->name);
fp = fopen("./gamesave.txt", "a");
fputs(buffer, fp);
free(buffer);
fclose(fp);
}
struct player* load()
{
FILE* fp = 0;
char* buffer = 0;
struct player* player = malloc(sizeof(struct player));
char tokens[] = "|\n";
buffer = malloc (80);
memset(buffer, 0, 80);
fp = fopen("./gamesave.txt", "r");
if (fgets(buffer, 80, fp)) {
char temp[20];
player->id = atoi(strtok(buffer, tokens));
strcpy(temp, strtok(NULL, tokens));
player->name = temp;
printf("during load : name is %s\n", player->name);
}
fclose(fp);
free(buffer);
return player;
}
void main()
{
struct player* player = malloc(sizeof(struct player));
player->id = 5;
player->name = "Bobby";
printf("before save : my name is %s and id is %d\n", player->name, player->id);
save(player);
struct player* playerN = load();
printf("after load : name is %s and id is %d", playerN->name, playerN->id);
}
这是我最近尝试这样做但我尝试了许多不同的方法,但它几乎总是以相同的问题结束:我似乎无法获得字符串的正确值虽然它适用于整数。我可以在保存之前,在加载函数期间打印播放器的名称,但是在加载之后它只打印垃圾(id工作得很好)。
我的猜测是,它与某种记忆问题有关,但就是这样,在数小时后无法解决。
提前致谢。
答案 0 :(得分:2)
您需要为player->name
分配空间。
您正在使用自动变量temp
,它的生命周期在函数返回时结束。自动变量在堆栈中。
所以你要在堆栈上取一个地址并将它作为你的对象。这会泄漏指向当前堆栈级别的指针,因为您将其返回。可以使用指向自动变量的指针,但仅在该函数实例处于活动状态时,即在其生命周期和它调用的函数中。