当我运行代码时,我得到了一个分段错误,但除此之外,它会编译并运行。如果你知道错误发生的原因,我会感谢你的帮助。同时请解释为什么会发生,因为我很好奇。
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main()
{
float att,def,hp,agi,stl,wis,ran,acc;
char name[10],contents[100];
int warrior,lvl=1,kills=0;
printf("What is your name?\n");
gets(name);
printf("1: Ninja\n");
printf("2: Knight\n");
printf("3: Archer\n\n");
printf("Pick a warrior.\n");
scanf("%i",warrior);
...
char attack[10],defense[10],health[10],agility[10],stealth[10],wisdom[10],range[10],accuracy[10],level[10],kill[10];
snprintf(attack,10,"%f",att);
snprintf(defense,10,"%f",def);
snprintf(health,10,"%f",hp);
snprintf(agility,10,"%f",agi);
snprintf(stealth,10,"%f",stl);
snprintf(wisdom,10,"%f",wis);
snprintf(range,10,"%f",ran);
snprintf(accuracy,10,"%f",acc);
snprintf(level,10,"%f",lvl);
snprintf(kill,10,"%f",kills);
char my_path[25];
strcat(my_path,"Warriors/");
strcat(my_path,name);
strcat(my_path,".txt");
FILE *fp;
fp = fopen(my_path, "w+");
fputs(attack, fp);
fputs(" ", fp);
fputs(defense, fp);
fputs(" ", fp);
fputs(health, fp);
fputs(" ", fp);
fputs(agility, fp);
fputs(" ", fp);
fputs(stealth, fp);
fputs(" ", fp);
fputs(wisdom, fp);
fputs(" ", fp);
fputs(range, fp);
fputs(" ", fp);
fputs(accuracy, fp);
fputs(" ", fp);
fputs(level, fp);
fputs(" ", fp);
fputs(kill, fp);
fclose(fp);
}
最佳答案
代码中有以下问题。
在读取scanf
的值时不正确使用warrior
。
/* scanf("%i",warrior); */ // Put '&' before warrior
scanf("%i",&warrior);
打印整数和整数的值时,
snprintf
中的格式说明符不正确。/* snprintf(level,10,"%f",lvl); */ // Change %f to %d
snprintf(level,10,"%d",lvl);
/* snprintf(kill,10,"%f",kills); */ // Change %f to %d
snprintf(kill,10,"%d",kills);
使用
lvl
和kills
而不初始化它。/* char my_path[25]; */ // Initialize as seen below
char my_path[25] = "";
strcat(my_path,"Warriors_");
strcat(my_path,name);
strcat(my_path,".txt");
最后,您使用的是应该避免使用的
strcat
。您可以将其更改为my_path
。现在来谈谈你的程序崩溃的原因。
首先,当您输入
gets
:而不是地址(即fgets
)时,您给出了scanf("%i",warrior);
变量的值。因为&warrior
没有初始化,所以它有一个不确定的值。现在warrior
把warrior
的值当作一个地址,并试图将该值写在那里。而且,由于scanf
的值是不确定的,所以它调用了未定义的行为。其次,当您在
warrior
中使用warrior
而不是%f
(格式说明符不匹配)时,代码再次调用未定义的行为。第三,当您在不初始化
%d
的情况下使用snprintf
时,您的数组strcat
将具有不确定的值。现在,my_path
从my_path
指向的地址开始查找值strcat
,并一直查找,直到找到0
为止。执行此操作时,它可能会尝试读取数组外部的值,再次调用未定义的行为。当调用未定义的行为时,任何事情都可能发生。在你的例子中,你有一个分割错误。
备注:您还应该检查
my_path
的返回值,以检查它是否成功。备注:您还应该检查
0
的返回值,以检查它是否成功。