gpt4 book ai didi

c - 我收到一个 SegFault 错误,但为什么呢?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:43 26 4
gpt4 key购买 nike

我在运行代码时收到段错误错误,但除此之外它编译并运行了。如果您知道为什么会发生错误,我将不胜感激。也请解释为什么会发生,因为我很好奇。

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

最佳答案

代码中存在以下问题。

  1. 在读取 warrior 的值时错误地使用了 scanf

    /* scanf("%i",warrior); */ // Put '&' before warrior
    scanf("%i",&warrior);
  2. 打印整数 lvlkills 的值时,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);
  3. strcatmy_path 一起使用,无需对其进行初始化。

    /* char my_path[25]; */ // Initialize as seen below 
    char my_path[25] = "";
    strcat(my_path,"Warriors_");
    strcat(my_path,name);
    strcat(my_path,".txt");
  4. 最后,您正在使用 gets,这应该避免。您可以将其更改为 fgets


现在来看看为什么你的程序会崩溃。

首先,当您执行 scanf("%i",warrior); 时:您给出了 warrior< 的值而不是地址(即 &warrior)/变量。由于 warrior 没有被初始化,它有一个不确定的值。现在 scanfwarrior 的值视为地址并尝试将值写入那里。而且,由于 warrior 的值是不确定的,它调用了未定义的行为。

其次,当您在 snprintf 中使用 %f 而不是 %d(格式说明符不匹配)时,代码再次调用未定义的行为。

第三,当您使用 strcat 而不初始化 my_path 时,您的数组 my_path 将具有不确定的值。现在,strcatmy_path 指向的地址开始寻找值 0 并继续寻找直到找到 0。在执行此操作时,它可能会尝试读取数组外的值,再次调用未定义的行为。

当调用未定义的行为时,任何事情都可能发生。在您的情况下,您遇到了段错误。


P.S.:您还应该检查 scanf 的返回值以检查它是否成功。

P.S.:您还应该检查 fopen 的返回值以检查它是否成功。

关于c - 我收到一个 SegFault 错误,但为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38908952/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com