• ベストアンサー

配列へのキーボード入力

次のような問題がわからなくて困っています。 まず、キーボード入力により配列の大きさを決め、 その後、先ほど入力した個数のデータをキ-ボードから入力するというものです。 これだけならわかるのですが、条件があって、入力は次のようにするとあります。 2 3 ←配列の大きさ(2行3列) 1 2 3 ←配列に入れるデータ 1行目 4 5 6 ←配列に入れるデータ 2行目 Cプログラミングを始めて間もない初心者です。どなたかよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

領域の動的確保のやり方と、それを二次元配列に適用するあたりが分からない んですよね? 大きさが決っていない配列を扱うには malloc() を使います。 また、二次元配列を扱うときには、一次元の配列の配列を順次獲得する 必要があることに注意が必要です。 多分、実物を見た方が分かりが早いんじゃないかなと思います。 #include <stdio.h> #include <stdlib.h> int main(void) {   int** ar; /* 行列 */   int row;  /* 行数 */   int col;  /* 列数 */   int i, j;   /* 行列の入力 */   scanf("%d %d", &row, &col);   ar = malloc(row * sizeof(int*));   for (i = 0 ; i < row ; ++i)   {     ar[i] = malloc(col * sizeof(int));     for (j = 0 ; j < col ; ++j)     {       scanf("%d", &ar[i][j]);     }   }   /* 行列の確認 */   printf("\n");   for (i = 0 ; i < row ; ++i)   {     for (j = 0 ; j < col ; ++j)     {       printf("%d ", ar[i][j]);     }     printf("\n");   }   /* 確保した領域を開放 */   for (i = 0 ; i < row ; ++i)   {     free(ar[i]);   }   free(ar);   return 0; } この実物では、動作上、必須ではないのですが、malloc() で確保した領域を free() で開放しています。開放は確保した順と逆に行うことに注意して。 分からないところがあれば、補足して下さい。

thsame
質問者

お礼

回答ありがとうございます。ソースまで書いていただいたおかげで、何とか理解できました。実は領域の動的確保よりももっと初歩的なところでつまずいていたのですが、それも解決しました。重ねて御礼申し上げます。

その他の回答 (1)

  • don_cha
  • ベストアンサー率34% (139/407)
回答No.1

領域の動的確保と、ポインタ操作ができれば、問題なく解けます。 条件の例でいっているのは、キーボードで2,3,1,2,3,4,5,6と数字キーを押すと、 最初の2個が行と列のサイズ(配列領域として[2][3]分を動的に確保)を指定し、 3個目が1行1列目(配列表現だと[0][0]に位置する箇所)、 4個目が1行2列目(配列表現だと[0][1]に位置する箇所)、 5個目が1行3列目(配列表現だと[0][2]に位置する箇所)、 6個目が2行1列目(配列表現だと[1][0]に位置する箇所)、 7個目が2行2列目(配列表現だと[1][1]に位置する箇所)、 8個目が2行3列目(配列表現だと[1][2]に位置する箇所) に入る(入れる)様にするということです。

thsame
質問者

お礼

回答ありがとうございます。質問の言葉が足りなくて申し訳ありません、わからないところはキーボード入力により、1行目の数値、1 2 3を一度に取り込むというところです。領域の動的確保はだいたい解ると思います。

関連するQ&A