我试图用文件数据填充结构。
文件用双点分隔,如下所示:
string1:15
当我读取文件并用数据填充结构的字段时,我得到了分段错误。
此处结构文件 character.h :
#ifndef CHARACTER_H_
#define CHARACTER_H_
typedef struct Character *Personaje;
struct Character{
char name[20];
int lvl;
};
extern void saveCharacter(char *name, int lvl);
extern Personaje *getCharacter();
extern char *toString(Personaje *pj);
#endif
此处源文件中的函数 character.c :
Personaje *getCharacter(){
FILE *fp;
Personaje *salida = (Personaje*) malloc(sizeof(Personaje));
fp = fopen("kprct", "rb");
fscanf(fp, "%[A-Za-z]:%d", (*salida)->name, &((*salida)->lvl));
printf("Linea: %s : %d\n", (*salida)->name, (*salida)->lvl);
fclose(fp);
return salida;
}
如何用文件数据填充结构?
答案 0 :(得分:2)
我认为,这里的主要问题是
typedef struct Character *Personaje;
这样,你已经将Personaje
作为指针,并且在代码中,你正在编写
Personaje *salida
创建指向指针的指针。我认为这不是必需的,也不是你想要的。我建议,将typedef
更改为
typedef struct Character Personaje;
以及fscanf()
和printf()
中对变量的所有访问权限。
另外,
malloc()
。C
和家人的返回值
fopen()
和fscanf()
的返回值,以确保成功。答案 1 :(得分:1)
提示:不要对指向结构的指针进行类型转换,而是对结构本身进行类型转换。这更容易混淆,并且将完全避免您在此处遇到的问题:仅为指针而不是结构分配空间。
您还要定义Character **
:
Personaje *salida = (Personaje*) malloc(sizeof(Personaje));
所以:使用给定的类型定义:
Personaje salida = malloc(sizeof(*salida));
注意:在*salida
中使用sizeof
会使此字词与salida
的类型无关。
您的代码的其余部分也会被破坏,因为您的函数还有一个*
过多的Personaje
。
正确的定义是:
typedef struct {
char name[20];
int lvl;
} Personaje; // or name the type just Character
然后,对于原型,请使用已有的Personaje *
。 malloc
- 行将是:
Personaje *salida = malloc(sizeof(*salida));
(注意:我没有必要更改sizeof()
- 参数。)
其他问题:
malloc
可能会返回NULL
,文件函数也可能会报告错误。fscanf
限制为char数组!就像现在一样,它是缓冲区溢出的邀请,又名未定义的行为。void *
,malloc
等使用free
。