gpt4 book ai didi

c - 多个连续的strcpy(),显示包含每个下一个strcpy()的位

转载 作者:行者123 更新时间:2023-11-30 18:48:04 24 4
gpt4 key购买 nike

这是我的代码,对于一个机器项目,我只是在编程类(class)(基础知识)的第一年。这是一个口袋妖怪战斗模拟器,我只是设置口袋妖怪的 Action 和统计数据,以供用户决定他的口袋妖怪是什么。然而,当我开始打印玩家 1 的移动集时,strcpy() 会变得困惑,并且不知何故它后面包含了 strcpy() 的位。

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

/*
Name: POKEMON 1v1 BATTLE SIMULATOR
Author: ADRIAN PAULE D. TY
Date Created: 10/18/2017
Last Modified: 10/18/2017
Description: This machine project is a program that puts two pokemon selected by the users against each other, taking the user's input to interact and determine the moves used.

*/

//--------------------------------------------------------------------------------------------------
//GLOBAL VARIABLES
///---Player 1
char cP1_Pokemon_Name[] = "POKEMON";
char cP1_Move1_Name[] = "TACKLE";
char cP1_Move2_Name[] = "POUND";
int nP1_HP_Base, nP1_HP_Current;
int nP1_Move1_PP, nP1_Move1_BP, nP1_Move2_PP, nP1_Move2_BP;
int nP1_Protect_PP= 5;
int nP1_Protect_Status = 0;
int nP1_ChargeUp_PP= 5;
int nP1_ChargeUp_Status = 0;

///---Player 2
char cP2_Pokemon_Name[] = "POKEMON";
char cP2_Move1_Name[] = "TACKLE";
char cP2_Move2_Name[] = "POUND";
int nP2_HP_Base, nP2_HP_Current;
int nP2_Move1_PP, nP2_Move1_BP, nP2_Move2_PP, nP2_Move2_BP;
int nP2_Protect_PP = 5;
int nP2_Protect_Status = 0;
int nP2_ChargeUp_PP = 5;
int nP2_ChargeUp_Status = 0;

//--------------------------------------------------------------------------------------------------
//FUNCTION PROTOTYPES
///---Player 1
void declare_pokemon_and_stats_1(int nChoice);
void display_player1_moveset_and_action();
///---Player 2
void declare_pokemon_and_stats_2(int nChoice);
void display_player2_moveset_and_action();
//--------------------------------------------------------------------------------------------------
//MAIN EXECUTION FUNCTION

int main(int argc, char *argv[]) {
int nP1_choice, nP2_choice;

printf("**************** POKEMON 1v1 BATTLE SIMULATOR **************** \n\n");
printf("Here are the POKEMON choices:\n");
printf("1 -- Entei\n");
printf("2 -- Milotic\n");
printf("3 -- Torterra\n");
printf("4 -- Pikachu\n");
printf("5 -- Groudon\n");
printf("6 -- Lapras\n");
printf("7 -- Stunfisk\n\n");

printf("PLAYER 1, please select your POKEMON: ");
scanf("%d", &nP1_choice);
declare_pokemon_and_stats_1(nP1_choice);


printf("PLAYER 2, please select your POKEMON: ");
scanf("%d", &nP2_choice);
declare_pokemon_and_stats_2(nP2_choice);

display_player1_moveset_and_action();
return 0;
}

//--------------------------------------------------------------------------------------------------
//FUNCTION DEFINITIONS

///---Declare Pokemon and Stats (PLAYER1)
/* This function sets the printed choice of PLAYER 1's Pokemon as well as the values for the stats, moves, PP of moves...... */
void declare_pokemon_and_stats_1(int nChoice){
int nP1_choice;

if (nChoice == 1){

nP1_HP_Base = 150;
nP1_HP_Current = 150;

strcpy(cP1_Move1_Name,"FIRE BLAST");
nP1_Move1_PP = 5;
nP1_Move1_BP = 30;

strcpy(cP1_Move2_Name,"EARTHQUAKE");
nP1_Move2_PP = 5;
nP1_Move2_BP = 30;

strcpy(cP1_Pokemon_Name, "ENTEI");
printf("PLAYER 1 has selected %s! \n\n", cP1_Pokemon_Name);

} else if (nChoice == 2){

nP1_HP_Base = 200;
nP1_HP_Current = 200;

strcpy(cP1_Move1_Name,"SCALD");
nP1_Move1_PP = 7;
nP1_Move1_BP = 20;

strcpy(cP1_Move2_Name,"ICE BEAM");
nP1_Move2_PP = 7;
nP1_Move2_BP = 20;

strcpy(cP1_Pokemon_Name,"MILOTIC");
printf("PLAYER 1 has selected %s! \n\n", cP1_Pokemon_Name);

} else if (nChoice == 3){

nP1_HP_Base = 220;
nP1_HP_Current = 220;

strcpy(cP1_Move1_Name,"DIG");
nP1_Move1_PP = 7;
nP1_Move1_BP = 20;

strcpy(cP1_Move2_Name,"LEAF STORM");
nP1_Move2_PP = 5;
nP1_Move2_BP = 40;

strcpy(cP1_Pokemon_Name,"TORTERRA");
printf("PLAYER 1 has selected %s! \n\n", cP1_Pokemon_Name);

} else if (nChoice == 4){

nP1_HP_Base = 120;
nP1_HP_Current = 120;

strcpy(cP1_Move1_Name,"THUNDERBOLT");
nP1_Move1_PP = 10;
nP1_Move1_BP = 10;

strcpy(cP1_Move2_Name,"DIG");
nP1_Move2_PP = 7;
nP1_Move2_BP = 20;

strcpy(cP1_Pokemon_Name,"PIKACHU");
printf("PLAYER 1 has selected %s! \n\n", cP1_Pokemon_Name);

} else if (nChoice == 5){

nP1_HP_Base = 150;
nP1_HP_Current = 150;

strcpy(cP1_Move1_Name,"FISSURE");
nP1_Move1_PP = 5;
nP1_Move1_BP = 40;

strcpy(cP1_Move2_Name,"FIRE BLAST");
nP1_Move2_PP = 5;
nP1_Move2_BP = 30;

strcpy(cP1_Pokemon_Name,"GROUDON");
printf("PLAYER 1 has selected %s! \n\n", cP1_Pokemon_Name);
} else if (nChoice == 6){

nP1_HP_Base = 190;
nP1_HP_Current = 190;

strcpy(cP1_Move1_Name,"ICE BEAM");
nP1_Move1_PP = 7;
nP1_Move1_BP = 20;

strcpy(cP1_Move2_Name,"SCALD");
nP1_Move2_PP = 7;
nP1_Move2_BP = 20;

strcpy(cP1_Pokemon_Name,"LAPRAS");
printf("PLAYER 1 has selected %s! \n\n", cP1_Pokemon_Name);
} else if (nChoice == 7){

nP1_HP_Base = 130;
nP1_HP_Current = 130;

strcpy(cP1_Move1_Name,"WATER GUN");
nP1_Move1_PP = 10;
nP1_Move1_BP = 10;

strcpy(cP1_Move2_Name,"EARTHQUAKE");
nP1_Move2_PP = 5;
nP1_Move2_BP = 30;

strcpy(cP1_Pokemon_Name,"STUNFISK");
printf("PLAYER 1 has selected %s! \n\n", cP1_Pokemon_Name);
} else {
printf("PLAYER 1, please select your POKEMON (from the list, Please): ");
scanf("%d", &nP1_choice);
declare_pokemon_and_stats_1(nP1_choice);
}

}

///---Declare Pokemon and Stats (PLAYER2)
/* This function sets the printed choice of PLAYER 2's POkemon as well as the values for the stats, moves, PP of moves...... */
void declare_pokemon_and_stats_2(int nChoice){
int nP2_choice;

if (nChoice == 1){

nP2_HP_Base = 150;
nP2_HP_Current = 150;

strcpy(cP2_Move1_Name,"FIREBLAST");
nP2_Move1_PP = 5;
nP2_Move1_BP = 30;

strcpy(cP2_Move2_Name,"EARTHQUAKE");
nP2_Move2_PP = 5;
nP2_Move2_BP = 30;

strcpy(cP2_Pokemon_Name,"ENTEI");
printf("PLAYER 2 has selected %s! \n\n", cP2_Pokemon_Name);

} else if (nChoice == 2){

nP2_HP_Base = 200;
nP2_HP_Current = 200;

strcpy(cP2_Move1_Name,"SCALD");
nP2_Move1_PP = 7;
nP2_Move1_BP = 20;

strcpy(cP2_Move2_Name,"ICE BEAM");
nP2_Move2_PP = 7;
nP2_Move2_BP = 20;

strcpy(cP2_Pokemon_Name,"MILOTIC");
printf("PLAYER 2 has selected %s! \n\n", cP2_Pokemon_Name);
} else if (nChoice == 3){

nP2_HP_Base = 220;
nP2_HP_Current = 220;

strcpy(cP2_Move1_Name,"DIG");
nP2_Move1_PP = 7;
nP2_Move1_BP = 20;

strcpy(cP2_Move2_Name,"LEAF STORM");
nP2_Move2_PP = 5;
nP2_Move2_BP = 40;

strcpy(cP2_Pokemon_Name,"TORTERRA");
printf("PLAYER 2 has selected %s! \n\n", cP2_Pokemon_Name);
} else if (nChoice == 4){

nP2_HP_Base = 120;
nP2_HP_Current = 120;

strcpy(cP2_Move1_Name,"THUNDERBOLT");
nP2_Move1_PP = 10;
nP2_Move1_BP = 10;

strcpy(cP2_Move2_Name,"DIG");
nP2_Move2_PP = 7;
nP2_Move2_BP = 20;

strcpy(cP2_Pokemon_Name,"PIKACHU");
printf("PLAYER 2 has selected %s! \n\n", cP2_Pokemon_Name);
} else if (nChoice == 5){

nP2_HP_Base = 150;
nP2_HP_Current = 150;

strcpy(cP2_Move1_Name,"FISSURE");
nP2_Move1_PP = 5;
nP2_Move1_BP = 40;

strcpy(cP2_Move2_Name,"FIRE BLAST");
nP2_Move2_PP = 5;
nP2_Move2_BP = 30;

strcpy(cP2_Pokemon_Name,"GROUDON");
printf("PLAYER 2 has selected %s! \n\n", cP2_Pokemon_Name);
} else if (nChoice == 6){

nP2_HP_Base = 190;
nP2_HP_Current = 190;

strcpy(cP2_Move1_Name,"ICE BEAM");
nP2_Move1_PP = 7;
nP2_Move1_BP = 20;

strcpy(cP2_Move2_Name,"SCALD");
nP2_Move2_PP = 7;
nP2_Move2_BP = 20;

strcpy(cP2_Pokemon_Name,"LAPRAS");
printf("PLAYER 2 has selected %s! \n\n", cP2_Pokemon_Name);
} else if (nChoice == 7){

nP2_HP_Base = 130;
nP2_HP_Current = 130;

strcpy(cP2_Move1_Name,"WATER GUN");
nP2_Move1_PP = 10;
nP2_Move1_BP = 10;

strcpy(cP2_Move2_Name,"EARTHQUAKE");
nP2_Move2_PP = 5;
nP2_Move2_BP = 30;

strcpy(cP2_Pokemon_Name,"STUNFISK");
printf("PLAYER 2 has selected %s! \n\n", cP2_Pokemon_Name);
} else {
printf("PLAYER 2, please select your POKEMON (from the list, Please): ");
scanf("%d", &nP2_choice);
declare_pokemon_and_stats_2(nP2_choice);
}

}

void display_player1_moveset_and_action(){

printf("***********************************************************************\n \n");

printf("%s: %d/%d HP\n", cP1_Pokemon_Name, nP1_HP_Base, nP1_HP_Current);
printf("%s: %d/%d HP\n\n", cP2_Pokemon_Name, nP2_HP_Base, nP2_HP_Current);

printf("%s's moves are: \n", cP1_Pokemon_Name);
printf("1 -- %s (%d BP, %d PP) \n", cP1_Move1_Name, nP1_Move1_BP, nP1_Move1_PP);
printf("2 -- %s (%d BP, %d PP) \n", cP1_Move2_Name, nP1_Move2_BP, nP1_Move2_PP);
printf("3 -- PROTECT (%d PP) \n", nP1_Protect_PP);
printf("4 -- CHARGE UP (%d PP) \n", nP1_ChargeUp_PP);

getch();
display_player2_moveset_and_action();
}

void display_player2_moveset_and_action(){

printf("***********************************************************************\n \n");

printf("%s: %d/%d HP\n", cP1_Pokemon_Name, nP1_HP_Base, nP1_HP_Current);
printf("%s: %d/%d HP\n\n", cP2_Pokemon_Name, nP2_HP_Base, nP2_HP_Current);

printf("%s's moves are: \n", cP2_Pokemon_Name);
printf("1 -- %s (%d BP, %d PP) \n", cP2_Move1_Name, nP2_Move1_BP, nP2_Move1_PP);
printf("2 -- %s (%d BP, %d PP) \n", cP2_Move2_Name, nP2_Move2_BP, nP2_Move2_PP);
printf("3 -- PROTECT (%d PP) \n", nP2_Protect_PP);
printf("4 -- CHARGE UP (%d PP) \n", nP2_ChargeUp_PP);

getch();
display_player1_moveset_and_action();
}

这是我得到的输出:

**************** POKEMON 1v1 BATTLE SIMULATOR ****************

Here are the POKEMON choices:
1 -- Entei
2 -- Milotic
3 -- Torterra
4 -- Pikachu
5 -- Groudon
6 -- Lapras
7 -- Stunfisk

PLAYER 1, please select your POKEMON:
1
PLAYER 1 has selected ENTEI!

PLAYER 2, please select your POKEMON: 4
PLAYER 2 has selected PIKACHU!

***********************************************************************

ENTEI: 150/150 HP
PIKACHU: 120/120 HP

ENTEI's moves are:
1 -- FIRE BLEARTHQUAKE (30 BP, 5 PP)
2 -- EARTHQUAKE (30 BP, 5 PP)
3 -- PROTECT (69 PP)
4 -- CHARGE UP (5 PP)
***********************************************************************

ENTEI: 150/150 HP
PIKACHU: 120/120 HP

PIKACHU's moves are:
1 -- THUNDERDIG (10 BP, 10 PP)
2 -- DIG (20 BP, 7 PP)
3 -- PROTECT (5 PP)
4 -- CHARGE UP (5 PP)

出于某种原因,应该是火焰爆炸的东西包含了一些地震(FIRE BLEARTHQUAKE),玩家 2 的其他 Action 组也是如此。

此外,由于某种原因,即使我设置了nP1_Protect_PP = 5,它也会打印为69

感谢您的帮助

最佳答案

这两行显示出了什么问题:

以下行声明一个用“POUND”初始化的 char cP1_Move2_Name 数组。该数组的大小正好是 6 个字节,即“POUND”中的 5 个字符加上 NUL 终止符的 1 个字符(字符串以 NUL 字符终止,请阅读 C 教科书中处理字符串的章节以了解更多详细信息):

char cP1_Move2_Name[] = "POUND";

现在,在下面的行中,将“EARTHQUAKE”复制到数组cP1_Move2_Name中。对于“EARTHQUAKE”,您需要 11 个字节,但如前所述,cP1_Move2_Name 数组的大小仅为 6。

strcpy(cP1_Move2_Name,"EARTHQUAKE");

因此,会发生的情况是复制的字节数超过了空间,因此其他一些内存将被覆盖,您可能会遇到各种问题。

为了纠正程序,您可以声明数组具有预定的最大大小,以确保始终有足够的空间。

#define MAXSTRINGLENGTH 100
...
char cP1_Pokemon_Name[MAXSTRINGLENGTH] = "POKEMON";
char cP1_Move1_Name[MAXSTRINGLENGTH] = "TACKLE";
char cP1_Move2_Name[MAXSTRINGLENGTH] = "POUND";
...
etc.

关于c - 多个连续的strcpy(),显示包含每个下一个strcpy()的位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46814219/

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