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

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

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

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

配列

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

Q&A

1回答

1845閲覧

C言語上での二次元配列におけるscanf前後での数値変化

shunsukex1

総合スコア11

C

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

配列

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

0グッド

0クリップ

投稿2021/11/23 15:04

C言語の二次元配列について質問です。
私はcでマインスイーパーを作ろうとしています。
最初にマス目の指定を行い、その後にあけるマス目を選ぶようにしているのですが、
その際に9x9マスの指定で始めてみるとscanf前後でマス目のx:9,y:9の部分のみがそのマス目指定で入力したyの値が代入されてしまいます。
scanfの前後で勝手に配列の中身が変化してしまうことはあるのでしょうか。
ご教授お願いします。

以下に該当するソースコードを張ります。

C言語

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4int main() 5{ 6 int a, x, y; 7 int counter = 0; 8 int xx, yy; 9 int i; 10 int bomb; 11 srand(time(0)); 12 printf("サイズを決めてください(9以下でお願いします)"); 13 scanf("%d", &a); 14 printf("サイズは%dx%dになりました", a, a); 15 int map[a][a]; 16 for (y = 1; y <= a; y++) 17 { 18 for (x = 1; x <= a + 1; x++) 19 { //配列は1~aまでの数になる。 20 map[y][x] = -1; //-1が何もなく手つかず 21 // printf("%d",map[x][y]); 22 } 23 } 24 for (i = 1; i <= a; i++) 25 { //配列の並びは1列目からにする 26 x = rand() % a + 1; //a個からえらぶ 27 y = rand() % a + 1; 28 printf("%d,%d", x, y); 29 if (map[y][x] == -1) 30 { 31 map[y][x] = -2; //-2はボムが設置 32 printf("|||"); 33 } 34 else 35 { //もし置く場所にすでにボムがあった場合にもう一回施行させるリセット 36 i--; //かならずaより下にはいかな 37 printf("map"); 38 } 39 } 40 printf("\n "); 41 for (i = 1; i <= a; i++) 42 { 43 printf(" %d", i); 44 } 45 printf(" \n"); 46 printf(" +"); 47 for (i = 0; i < 2 * a + 1; i++) 48 { 49 printf("-"); 50 } 51 printf("+\n"); 52 for (y = 1; y <= a; y++) 53 { 54 printf("%d| ", y); 55 for (x = 1; x <= a; x++) 56 { 57 if (map[y][x] >= 0) 58 { 59 printf("%d ", map[y][x]); 60 } 61 else 62 { 63 printf(" "); 64 } 65 } 66 printf("|\n"); 67 } 68 printf(" +"); 69 for (i = 0; i < 2 * a + 1; i++) 70 { 71 printf("-"); 72 } 73 printf("+\n"); 74 printf("ボムは%d個あります。", a); 75 printf("ゲーム開始!!\n"); 76 while (1) 77 { 78 bomb = 0; //ボムの初期化 79 printf(" "); 80 for (i = 1; i <= a; i++) 81 { 82 printf(" %d", i); 83 } 84 printf(" \n"); 85 printf(" +"); 86 for (i = 0; i < 2 * a + 1; i++) 87 { 88 printf("-"); 89 } 90 printf("+\n"); 91 for (y = 1; y <= a; y++) 92 { 93 printf("%d| ", y); 94 for (x = 1; x <= a; x++) 95 { 96 if (map[y][x] >= 0) 97 { 98 printf("%d ", map[y][x]); 99 // ; 100 } 101 else 102 { 103 printf(" "); 104 } 105 } 106 printf("|\n"); 107 } 108 printf(" +"); 109 for (i = 0; i < 2 * a + 1; i++) 110 { 111 printf("-"); 112 } 113 printf("+\n"); 114 counter++; 115 //プレイヤーが場所を入力 116 printf("%d", map[9][9]); 117 //scanf前のmap[9][9]の数値 118 printf(" ~%d回目~ 場所を入力してください。(x y):", counter); 119 scanf("%d%d", &xx, &yy); //scanf後のmap[9][9]の数値 120 printf("%d", map[9][9]); 121 if (map[yy][xx] < 0) 122 { 123 if (xx <= a && yy <= a && xx > 0 && yy > 0) 124 { 125 // printf("%d %d",xx,yy); 126 //爆弾の場合ボムを引く 127 if (map[yy][xx] == -2) 128 { 129 printf("your lose."); 130 break; 131 } 132 if (map[yy - 1][xx] == -2) 133 { //その場所の上にボムがあるか 134 bomb++; 135 //printf("op上"); 136 } 137 if (map[yy + 1][xx] == -2) 138 { //その場所の下にボムがあるか 139 bomb++; 140 //printf("op下"); 141 } 142 if (map[yy][xx + 1] == -2) 143 { //その場所の右にボムがあるか 144 bomb++; 145 //printf("op右"); 146 } 147 if (map[yy][xx - 1] == -2) 148 { //その場所の左にボムがあるか 149 bomb++; 150 //printf("op左"); 151 } 152 if (map[yy - 1][xx - 1] == -2) 153 { //その場所左上にボムがあるか 154 bomb++; 155 //printf("op左上"); 156 } 157 if (map[yy - 1][xx + 1] == -2) 158 { //その場所の右上にボムがあるか 159 bomb++; 160 //printf("op右上"); 161 } 162 if (map[yy + 1][xx - 1] == -2) 163 { //その場所の左下にボムがあるか 164 bomb++; 165 //printf("op左下"); 166 } 167 if (map[yy + 1][xx + 1] == -2) 168 { //その場所の右下にボムがあるか 169 bomb++; 170 //printf("op右下"); 171 } 172 map[yy][xx] = bomb; 173 } 174 else 175 { 176 printf("値が場の大きさを超えています。"); 177 counter--; 178 } 179 } 180 else 181 { 182 printf("同じ場所です"); 183 counter--; 184 printf("%d", map[9][9]); 185 } 186 187 if (a * a - a == counter) 188 { 189 printf("congraturaion"); 190 break; 191 } 192 } 193 return 0; 194}

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

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

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

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

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

guest

回答1

0

mapが9×9の二次元配列だとすると、
アクセスできるのはmap[0][0]からmap[8][8]までです。

map[9][9]を出力して、出鱈目な値が返ってくるのは不思議ではないです。


なお、配列の要素数として変数を使うのは避けた方が良いです。
(VLAはC11だとオプション機能だったり、ややこしい印象)

今回の場合、配列の要素数は固定値にしてしまっても問題ないように見えます。

投稿2021/11/23 15:16

編集2021/11/23 15:21
LouiS0616

総合スコア35660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問