我已经尝试了很多与fscanf
和打印函数有关的东西,Fight
函数在不同的文件中,并且有这个原型
void Fight( char * combatant1, int ac1, int hp1, int hitbonus1, int damagebonus1, char * combatant2, int ac2, int hp2, int hitbonus2, int damagebonus2);
但我不认为这是错误的根源。当这行被注释掉时,我仍然会遇到seg错误。有人能帮我吗?数据文件看起来像这个
名称#######
这是我的代码
void printInfo(FILE *f1, FILE *f2){
char* name1;
char* name2;
int armor1;
int armor2;
int hp1;
int hp2;
int hb1;
int hb2;
int db1;
int db2;
fscanf(f1, "%s %d %d %d %d", name1, &armor1,&hp1,&hb1,&db1);
printf("nName=%s, Armor=%d, Hit Points=%d, Hit Bonus=%d, Damage Bonus=%d", name1,armor1,hp1,hb1,db1);
fscanf(f2, "%s %d %d %d %d", name2, &armor2,&hp2,&hb2,&db2);
printf("nName=%s, Armor=%d, Hit Points=%d, Hit Bonus=%d, Damage Bonus=%d", name2,armor2,hp2,hb2,db2);
//Fight(name1,armor1,hp1,hb1,db1,name2,armor2,hp2,hb2,db2);
}
每个指针在声明后都需要初始化为有效地址。而这个地址,为了有效,需要被分配。你的指针
char* name1;
char* name2;
不要实际指向有效的内存位置。因此,当fscanf
试图将名称写入name1
和name2
所指向的地址时,它实际上写入了导致分段故障的无效地址。
您可以在两个选项之间进行选择。使用数组静态分配名称,无论是作为全局变量还是在堆栈区域中本地分配
char name1[50];
char name2[50];
或动态
char* name1 = malloc(50);// That is (50*sizeof char). But sizeof(char) is 1.
char* name2 = malloc(50);
在这个例子中,50个字节被分配为字符串的最大大小。为了在其中存储最多49个字符(字符串终止符需要一个字符(,可以在fscanf
中使用正确的字符串格式。例如
fscanf(f1, "%49s %d %d %d %d", name1, &armor1,&hp1,&hb1,&db1);
使用数据结构优化代码
虽然这与您的问题无关,但我注意到您的Fight
函数有10个参数:
void Fight( char * combatant1, int ac1, int hp1, int hitbonus1, int damagebonus1, char * combatant2, int ac2, int hp2, int hitbonus2, int damagebonus2);
定义一个参数过多的函数有时可能会导致堆栈消耗效率低下(尤其是在嵌入式系统中,只有前3或4个参数使用处理器寄存器,而所有其他参数都复制到堆栈中(。
解决方案是使用数据结构。在你的情况下,你有两名战斗人员,每个人都有5处房产。因此,作战人员结构的定义如下
typedef struct
{
char name[50];
int ac;
int hp;
int hitbonus;
int damagebonus;
} Combatant_t;
将简化Fight()
函数的接口,因为您只需向它传递两个指向战斗人员的指针。其签名将变为:
void Fight(Combatant_t *cb1, Combatant_t *cb2);
你的printInfo()
会变成:
void printInfo(FILE *f1, FILE *f2)
{
Combatant_t *comb1 = malloc( sizeof(Combatant_t) );
Combatant_t *comb2 = malloc( sizeof(Combatant_t) );
/* Note: malloc might fail. Remember to manage that scenario */
/* memset to 0 newly allocated structs */
memset( comb1, 0, sizeof(*comb1) );
memset( comb2, 0, sizeof(*comb2) );
fscanf(f1, "%49s %d %d %d %d", comb1->name, &(comb1->ac), &(comb1->hp), &(comb1->hitbonus), &(comb1->damagebonus));
printf("nName=%s, Armor=%d, Hit Points=%d, Hit Bonus=%d, Damage Bonus=%d", comb1->name, comb1->ac, comb1->hp, comb1->hitbonus, comb1->damagebonus);
fscanf(f1, "%49s %d %d %d %d", comb2->name, &(comb2->ac), &(comb2->hp), &(comb2->hitbonus), &(comb2->damagebonus));
printf("nName=%s, Armor=%d, Hit Points=%d, Hit Bonus=%d, Damage Bonus=%d", comb2->name, comb2->ac, comb2->hp, comb2->hitbonus, comb2->damagebonus);
//Fight( comb1, comb2);
/* Remember to free comb1 an comb2 as soon as you don't need them anymore */
}