gpt4 book ai didi

c - C程序内存错误,名称消失?

转载 作者:行者123 更新时间:2023-12-04 12:04:36 25 4
gpt4 key购买 nike

我正在尝试制作一个简单的游戏,http://pastebin.com/BxEBB7Z6 ,在c。目标是通过获取随机数尽可能接近 21 来击败计算机。

每一轮都会显示玩家姓名和总和,但由于某些原因,它只在第一次有效?像这样:

玩家约翰的总和为 0。玩家有总和 9。玩家的总和为 11。

等等。

为什么玩家的名字只显示一次,之后就不再显示了?我不会在某处重新分配 :-)

我使用函数 void PrintPlayerSum(struct Player *p) 打印出来,它第一次工作,但仅此而已。

#include <stdio.h>
#include <stdlib.h>

#include <time.h>

struct Player
{
char name[256];
int sum;
};

void PrintPlayerSum(struct Player *p)
{
printf("Player %s has sum %d\n", p->name, p->sum);
}

void wait ( int seconds )
{
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait) {}
}

int main()
{
struct Player *player = malloc(sizeof(*player));
strcpy( player->name, "John");
player->sum = 0;

while(1)
{
PrintPlayerSum(player);

printf("Do you want another number? (y/n, q for quit) ");
char ch;

scanf("%s", &ch);

if( ch == 'q' )
break;

if( ch == 'y' )
{
srand(time(NULL));

int rnd = rand() % 13 + 1;
player->sum += rnd;

printf("Player got %d\n", rnd);
}

if( ch == 'n' || player->sum > 21)
{
if( player->sum > 21 )
{
printf("\n*** You lost the game, please try again... ***");
}
else
{
printf("\nCPU's turn\n");

int cpusum = 0;

while( 1 )
{
if( cpusum > 21 )
{
printf("\n*** CPU lost the game with the score %d, you win! ***", cpusum);
break;
}

if( cpusum > player->sum )
{
printf("\n*** CPU won the game with the score %d, please try again ***", cpusum);
break;
}

wait(1);
srand(time(NULL));
int rnd = rand() % 13 + 1;
cpusum += rnd;

printf("CPU got %d, sum is %d\n", rnd, cpusum);
}
}

break;
}

printf("\n\n");
}

/* Cleanup ******************/
free(player);
/****************************/

printf("\n\n\n");
system("PAUSE");
return 0;
}

最佳答案

我怀疑问题出在您对 scanf 的使用上。你说你想读取一个以零结尾的字符串,但是你把它塞进了一个字符中。变量在堆栈上的布局方式导致终止零字节最终成为 player->name 中的第一个字符。

尝试输入“buffer overflow”而不是“y”,你应该得到“player buffer overflow go ...”。

如果您想坚持使用 scanf,则需要确保向其传递正确的字符串并设置目标缓冲区大小的限制。要读取一个字符,请尝试 fgetc。

编辑:上面的当然不太对。。。是buffer overflow,不过是player struct的指针被覆盖了。幸运的是,您得到了一个指向零字节的有效地址。通过键入更多内容,您很可能会遇到崩溃。

关于c - C程序内存错误,名称消失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7510718/

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