質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

1回答

326閲覧

scanfで入力したもの同士で四則演算したい

mimimi0251

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2023/11/14 02:48

実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2023/11/14 03:15 編集

>配列やポインタがまだ分からず… >何度も書き直したりしていたら… プログラムは分からないまま書いてどうなるものではありません。 分からないモノが分かっているのなら、それを分かるまで勉強するべきではないでしょうか。 そもそも提示されているコードをコピペしてもコンパイルが通りません。
otn

2023/11/14 05:25

> scanfで入力したもの同士で四則演算したいのですが、配列やポインタがまだ分からず作業が止まってしまっています。 書こうと思ったら同じ事を書かれていました。 理解しないままでプログラムを書いて動かしても時間の浪費ですよ。 このプログラムは、もっと簡単なプログラムでポインターや配列を理解してから取り組みましょう。
guest

回答1

0

c

1 scanf("%d", SelectPlayer);

ここで int の変数 SelectPlayer を渡してますが、そのポインタ &SelectPlayer が正しいでしょう。
コンパイルするときに警告が出ませんでしたか?

投稿2023/11/14 03:08

int32_t

総合スコア20533

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mimimi0251

2023/11/14 03:37

警告出てました!ありがとうございます! &を付けると配列を示すポインタって認識で良いのでしょうか?
int32_t

2023/11/14 04:05

> &を付けると配列を示すポインタって認識で良いのでしょうか? いいえ。このコードに配列は無関係です。 scanf() で int の値を受け取りたいなら、int へのポインタを渡すということです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問