下班后我的程序正确生成随机段错误
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);
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);