c-我的程序在工作后正确生成随机段故障



debug我试着制作了一个简单的生活模拟器程序9000步任何东西都很好,但当我接近最后一步生存时,当还有3或4步时,就会出现分段故障,不是在程序开始时,而是在程序准备好工作很长时间后。我试着检查错误,在下面的代码中,sscanf看起来有问题。如果有人能帮我,我会非常感激,因为我试着准备好了我所知道的一切来追踪问题。

#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], "%03dt%st%03dt%03dt%03dt%03dn", 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], "%03dt%st%03dt%03dt%03dt%03dn", &creat.no, creat.name, &creat.age, &creat.fast, &creat.life, &creat.streng);
if (creat.life == 0) {
life();
}
sscanf(animals[rnd1], "%03dt%st%03dt%03dt%03dt%03dn", &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 %sn AGE %dn FAST %dn LIFE %dn STRENG %dn ", creat.no, creat.name, creat.age + 1, creat.fast, creat.life, creat.streng);
sprintf(animals[rnd], "%03dt%st%03dt%03dt%03dt%03dn", creat.no, creat.name, creat.age + 1, creat.fast, creat.life, creat.streng);
// creature one
printf("n NO %03d n NAME %sn AGE %dn FAST %dn LIFE %dn STRENG %dn ", creat1.no, creat1.name, creat1.age + 1, creat1.fast, creat1.life, creat1.streng);
sprintf(animals[rnd1], "%03dt%st%03dt%03dt%03dt%03dn", 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()(这是一个无限循环-为什么?):

  • 两个随机数的值恰好相等,我认为你是在试图阻止动物攻击自己。也许功能应该返回,或者它应该再次尝试选择两种不同的动物。更改:

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

    if (rnd == rnd1) return;
    
  • creature.life为0,我认为这表明动物已经死亡。同样,您可能应该从函数返回。更改:

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

    if (creat.life == 0 ) return;
    

对于CCD_ 7也是如此。

另一个建议是,调用system("clear")将非常缓慢。你可以打印出ANSI转义序列来清除终端:

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

最新更新