当我运行代码时,我得到了一个分段错误,但除此之外,它会编译并运行。如果你知道错误发生的原因,我会感谢你的帮助。同时请解释为什么会发生,因为我很好奇。

#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);

使用lvlkills而不初始化它。
/* 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没有初始化,所以它有一个不确定的值。现在warriorwarrior的值当作一个地址,并试图将该值写在那里。而且,由于scanf的值是不确定的,所以它调用了未定义的行为。
其次,当您在warrior中使用warrior而不是%f(格式说明符不匹配)时,代码再次调用未定义的行为。
第三,当您在不初始化%d的情况下使用snprintf时,您的数组strcat将具有不确定的值。现在,my_pathmy_path指向的地址开始查找值strcat,并一直查找,直到找到0为止。执行此操作时,它可能会尝试读取数组外部的值,再次调用未定义的行为。
当调用未定义的行为时,任何事情都可能发生。在你的例子中,你有一个分割错误。
备注:您还应该检查my_path的返回值,以检查它是否成功。
备注:您还应该检查0的返回值,以检查它是否成功。

10-08 09:29