下班后我的程序正确生成随机段错误

my program after work correct generate random segment fault

debug 我尝试制作一个简单的生活模拟器程序,超过 9000 步任何工作都很好,但是当我接近最后一个生存时,当仍然有 3 或 4 个时,出现分段错误,不是在程序开始时,而是在程序准备好工作了很长时间之后。我尝试检查错误,看起来像下面代码中的 sscanf int 有问题。 如果有人能帮助我,我将不胜感激,因为我已尝试准备任何我知道的东西来跟踪问题。

#include <string.h>
#include <stdio.h>
#include <math.h>
#include <inttypes.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>

void newborn();
void attack();
int rnd();
void life();
char animals[100][100];

typedef struct {
    int no;
    char name[30];
    int fast;
    int life;
    int streng;
    int age;
} creature;

int
main()
{
    rnd();
    newborn();
    life();
}

void
newborn()
{
    char name[30];
    creature creat;

    rnd();
    for (int x = 0; x <= 99; x++) {
        sprintf(name, "REX");
        strcpy(creat.name, name);
        creat.no = x;
        creat.age = 0;
        creat.fast = rand() % 100;
        creat.life = 10;
        creat.streng = rand() % 100;;
        sprintf(animals[x], "%03d\t%s\t%03d\t%03d\t%03d\t%03d\n", creat.no, creat.name, creat.age, creat.fast, creat.life, creat.streng);
    }
}

void
attack()
{

    creature creat;
    creature creat1;
    int rnd;
    int rnd1;

    rnd = rand() % 100;
    rnd1 = rand() % 100;
    if (rnd == rnd1) {
        life();
    }

    sscanf(animals[rnd], "%03d\t%s\t%03d\t%03d\t%03d\t%03d\n", &creat.no, creat.name, &creat.age, &creat.fast, &creat.life, &creat.streng);
    if (creat.life == 0) {
        life();
    }

    sscanf(animals[rnd1], "%03d\t%s\t%03d\t%03d\t%03d\t%03d\n", &creat1.no, creat1.name, &creat1.age, &creat1.fast, &creat1.life, &creat1.streng);
    if (creat1.life == 0) {
        life();
    }

    if (creat.fast > creat1.fast) {
        if (creat.streng > creat1.streng) {
            creat.life++;
            creat.streng++;

            creat1.life--;
            // creat1.streng--;
        }
        if (creat.streng < creat1.streng) {
            creat.life--;
            // creat.streng++;

            creat1.life++;
            creat1.streng++;
        }
        if (creat.streng == creat1.streng) {
            creat.life--;

            creat1.life--;

        }
    }

    if (creat.fast < creat1.fast) {

        creat.life--;
        creat1.life--;
    }
    if (creat.fast == creat1.fast) {

        creat.life--;
        creat1.life--;
    }

    system("clear");
    // creature zero

    printf("\n NO %03d \n NAME %s\n AGE %d\n FAST %d\n LIFE %d\n STRENG %d\n ", creat.no, creat.name, creat.age + 1, creat.fast, creat.life, creat.streng);

    sprintf(animals[rnd], "%03d\t%s\t%03d\t%03d\t%03d\t%03d\n", creat.no, creat.name, creat.age + 1, creat.fast, creat.life, creat.streng);

    // creature one

    printf("\n NO %03d \n NAME %s\n AGE %d\n FAST %d\n LIFE %d\n STRENG %d\n ", creat1.no, creat1.name, creat1.age + 1, creat1.fast, creat1.life, creat1.streng);

    sprintf(animals[rnd1], "%03d\t%s\t%03d\t%03d\t%03d\t%03d\n", creat1.no, creat1.name, creat1.age + 1, creat1.fast, creat1.life, creat1.streng);
}

int
rnd()
{
    srand(time(0));
    return 0;
}

void
life()
{

    while (1) {
        attack();
        usleep(20000);
    }
}

看来您可能输光了筹码。函数 life()attack() 相互调用 - 最终程序将 运行 出栈,并尝试通过 sscanf() 写入它会导致崩溃。

具体来说,attack() 调用 life()(这是一个无限循环 - 为什么?)当:

  • 2 个随机数的值恰好相等,我认为您是在试图防止动物攻击自己。也许函数应该 return,或者它应该再次尝试 select 2 种不同的动物。变化:

     if (rnd == rnd1){life();}
    

     if (rnd == rnd1) return;
    
  • creature.life 是 0,我认为这表明动物已经死亡。同样,您应该只从函数中 return 。变化:

     if (creat.life ==0 ){life();}
    

     if (creat.life == 0 ) return;
    

creat1.

也一样

另一个建议,调用 system("clear") 会很慢。您可以打印出 ANSI 转义序列来清除终端:

char *cls = "3[2J3[H";    // clear screen and move cursor home
printf(cls);