実現したいこと
scanfで入力したもの同士で四則演算したい
- ▲▲機能を動作するようにする
前提
ここに質問の内容を詳しく書いてください。
C言語をvisual studioでやっています。scanfで入力したもの同士で四則演算したいのですが、配列やポインタがまだ分からず作業が止まってしまっています。
①名前を二人分入力 → ⑥人数を決める(ここでバグってしまいます)
発生している問題・エラーメッセージ
ハンドルされない例外が 0x00007FFA3016DF28 (ucrtbase.dll) で発生しました(配列ポインタ.exe 内): 無効なパラメーターを致命的と見なす関数に無効なパラメーターが渡されました。
該当のソースコード
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h> // ---------------------------------------- // マクロ定義 // ---------------------------------------- #define PLAYER_MAX (2) #define MAX 256 #define SAVEFILENAME ("save.dat") // ---------------------------------------- // プロトタイプ宣言 // ---------------------------------------- // --------------------------------------- // 構造体宣言 // --------------------------------------- struct PLAYER //プレイヤーのステータス構造体 { char name[MAX]; // 名前 int HP; // HP int ATK; // ATK bool use; // 仕様フラグ }; struct PLAYER player[2]; int SelectMenu = 0; char SelectDel; FILE* fp; void Battle(void); void MenuPlayer() { // 画面全消し system("cls"); // メニュー表の表示 printf("[メニュー]\n"); printf("1:入力\t 2:表示\t 3:削除\n"); printf("0:終了\n\n"); printf(">"); // メニューの選択入力 rewind(stdin); scanf_s("%d", &SelectMenu); // 画面全消し system("cls"); } void DispPlayer() { FILE* fp; for (int i = 0; i < PLAYER_MAX; i++) { printf("【No.%02dの入力】\n", i + 1); printf("名前 >"); rewind(stdin); scanf_s("%s", player[i].name, MAX); printf("HP >"); rewind(stdin); scanf_s("%d", &player[i].HP); printf("攻撃 >"); rewind(stdin); scanf_s("%d", &player[i].ATK); // 仕様フラグを建てる // player[i].use = true; // (pPlayer + InputPlayerNum -1) ->use = true } } void Status() { FILE* fp; for (int i = 0; i < PLAYER_MAX; i++) { printf("*プレイヤー No.%02d の ステータス*\n\n", i + 1); printf("名前%s\n", player[i].name); printf("体力%d\n", player[i].HP); printf("攻撃%d\n", player[i].ATK); // if((pPlayer +1) ->use{ // // } } //入力待ち rewind(stdin); getchar(); } void DelPlayer() { printf("削除処理を行いますか?\n(y/n)"); rewind(stdin); scanf_s("%c", &SelectDel); if (SelectDel == 'y' || SelectDel == 'Y') { //初期化処理 for (int i = 0; i < PLAYER_MAX; i++) { printf("削除します\n"); strcpy(player[i].name, "ああああ"); player[i].HP = -1; player[i].ATK = -1; printf("削除します\n"); } } else { printf("削除処理\n"); printf("キャンセルしました\n"); } } void SavePlayer() { FILE* fp; fp = fopen("data\\save.txt", "wb"); fwrite(player, sizeof(player), 1, fp); fclose(fp); printf("セーブが完了しました\n\n"); rewind(stdin); getchar(); } void LoadPlayer() { fp = fopen("data\\save.txt", "rb"); if (fp != NULL) { fread(player, sizeof(player), 1, fp); fclose(fp); printf("セーブデータをロードしました"); rewind(stdin); getchar(); } } void Battle(PLAYER* pAtkPlayer, PLAYER* pDefPlayer) { FILE* fp; // ダメージ int damage = 0; // ダメージ計算 damage = pAtkPlayer->ATK; // ダメージ処理 pDefPlayer->HP -= damage; if (pDefPlayer->HP < 0); { pDefPlayer->HP < 0; } // 結果表示 printf("%sからの攻撃", player->name,pDefPlayer->name); printf("%dからのダメージ\n", damage); printf("%s残りHP"); } void BattleColosseum() { FILE* fp; PLAYER BattlePlayer[2]; int SelectPlayer = 0; for (int i = 0; i < 2; i++) { // 一人目 printf("戦わせる%d人目を決めてください", player); rewind(stdin); scanf("%d", SelectPlayer); int turn = 0; while (1); { Battle(&BattlePlayer[turn], &BattlePlayer[1] - turn); // BのHPチェック if (BattlePlayer[1].HP <= 0) { break; } // ダメージ処理 Battle(&BattlePlayer[turn], &BattlePlayer[1] - turn); // Aのダメージチェック if (BattlePlayer[0].HP <= 0) { break; } // ターンを1から0に切り替える turn = 1 - turn; } printf("勝ったのは%sです", BattlePlayer[turn].name); rewind(stdin); getchar(); } } // --------------------------------------- // main関数 // --------------------------------------- int main(void) { //PARAMETER構造体の実体化 int SelectMenu = 0; //メニュー入力用 // 初期化処理 for (int i = 0; i < PLAYER_MAX; i++) { strcpy(player[i].name, "ああああ"); player[i].HP = -1; player[i].ATK = -1; } // オープニング printf("プレイヤーの名前とステータスを表示してください\n\n"); printf("エンターキーを押してスタート!"); rewind(stdin); getchar(); // メニュー画面の為のループ while (1) { // 画面全消し system("cls"); bool FullInput = true; // プレイヤーの入力チェック for (int i = 0; i < PLAYER_MAX; i++) { if (player[i].use) { printf("■"); } else { printf("□"); FullInput = false; } } // メニュー表の表示 printf("[メニュー]\n"); printf("1:入力\t 2:表示\t 3:削除\t 4:セーブ 5:ロード 6:バトル\n"); printf("0:終了\n\n"); printf(">"); // メニューの選択入力 rewind(stdin); scanf_s("%d", &SelectMenu); // 画面全消し system("cls"); if (SelectMenu == 0) {// 終了 break; } else if (SelectMenu == 1) {// 1 入力 printf("入力のターン\n"); DispPlayer(); } else if (SelectMenu == 2) {// 2 表 Status(); } else if (SelectMenu == 3) {// 3 削除 DelPlayer(); } else if (SelectMenu == 4) {// 4セーブ SavePlayer(); } else if (SelectMenu == 5) {// ロード LoadPlayer(); } else if (SelectMenu == 6) { BattleColosseum(); } } printf("しゅーりょー"); //入力待ち rewind(stdin); getchar(); return 0; }
試したこと
何度も書き直したりしていたらエラーは出なくなったのですが、バグっているのでどこが悪いのかが分からなくなってしまいました。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。