• 締切済み

C言語で配列の連結について教えてください

以下のような構造体でmember[]の要素の後にmember2[]の要素を追加して、member[]を返す関数を作りたいのですがやり方がわかりません。よろしくお願いします。 (C++ vectorのpush_back、phpのarray_push()に相当する関数) typedef struct _MEMBER { char *name; int age; char *address; } MEMBER; MEMBER member[] = { "山田", 25, "東京都aaaaa", "木村", 30, "東京都bbbbb", "森田", 24, "東京都ccccc", }; MEMBER member2[] = { "伊藤", 23, "大阪府ddddd", "山野", 31, "大阪府eeeee", };

みんなの回答

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

無理です。 Cの配列は後からサイズを増やすことはできません。 だから、C++でvectorがあるのですし、Cでなんとかするのなら、mallocなどを使って、member,member2とは別にメモリを確保するなどします。 あるいは、 MEMBER member[5] = { "山田", 25, "東京都aaaaa", "木村", 30, "東京都bbbbb", "森田", 24, "東京都ccccc", }; MEMBER member2[] = { "伊藤", 23, "大阪府ddddd", "山野", 31, "大阪府eeeee", }; などとして、あらかじめmemberを必要なサイズ分用意するとかですね。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

愚直な例です。 #include <stdio.h> #include <stdlib.h> typedef struct _MEMBER { char *name; int age; char *address; } MEMBER; MEMBER *memcat(MEMBER *member, int sz, MEMBER *member2, int sz2) { MEMBER *mem; int i, j; mem = (MEMBER *) malloc(sizeof(MEMBER) * (sz + sz2)); if (!mem) return NULL; for (i = 0; i < sz; i++) { mem[i] = member[i]; } for (j = i; j < i + sz2; j++) { mem[j] = member2[j-i]; } return mem; } int main(void) { MEMBER member[] = { { "山田", 25, "東京都aaaaa" }, { "木村", 30, "東京都bbbbb" }, { "森田", 24, "東京都ccccc" }, }; MEMBER member2[] = { { "伊藤", 23, "大阪府ddddd" }, { "山野", 31, "大阪府eeeee" }, }; MEMBER *mem; int sz = sizeof(member) / sizeof(member[0]); int sz2 = sizeof(member2) / sizeof(member2[0]); int i; mem = memcat(member, sz, member2, sz2); if (!mem) exit(1); for (i = 0; i < sz + sz2; i++) { printf("%s %d %s\n", mem[i]); } free(mem); return 0; }

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.1

要素の追加をするなら、配列よりも リンク・リストの方が便利だと思います。 リンク・リストであれば、1レコードであっても、 複数レコードからなるリストであっても、 追加・挿入はポインタをつなぎかえるだけなので 単純かつ高速です。 配列で行きたいなら、次のようにして 追加関数を実装します。 1) 旧配列 + 追加レコード数が収まる分のメモリを確保します。   malloc()等で動的に割り当てます 2) 旧配列のデータを割り当てた領域に全部コピーします。 3) 旧配列のメモリを廃棄します 4) 追加するデータを新規配列にコピーします   2)でコピーし終わった直後のアドレスからコピーします こんな感じです 最小限のことしか書いていません。 実際には、レコード数の更新も必要になるでしょう。 なお、前提として この配列は最初から動的メモリ上に作成されていることが必要です。 静的領域だと拡張できません。 また、最大サイズが最初から見積もれる場合で、 そのサイズが搭載メモリ量に比し、小さい場合 (ex 1GByteの物理メモリに対し、MAX 1MByteとか...) の場合は、 あらかじめ、MAXの容量を確保しておいて 現在格納数を管理する方式で行うと 簡単にできます。 ただし、メモリは無駄になることは承知しておくべきです。

関連するQ&A

  • 連想配列を変数にする?

    こんにちは。 質問タイトルが変かもしれません。。。 xmlから受け取ったデータをphpで表示してます。 ・・・xmlデータの受取(?)は他社にお願いしており、私はphpでの表示のみなのでデータそのものは分かりません。 [aaaaa][bbbbb][ccccc][ddddd][depday] [aaaaa][bbbbb][ccccc][ddddd][cityname] [aaaaa][bbbbb][ccccc][ddddd][b][depday] [aaaaa][bbbbb][ccccc][ddddd][b][cityname] のように非常に長い連想配列があり、一番最後の[depday]と[cityname]は常に同じです。あまりにも長いので $hairetsu_1 = [aaaaa][bbbbb][ccccc][ddddd]; echo $hairetsu_1[depday]; echo $hairetsu_1[cityname]; $hairetsu_2 = [aaaaa][bbbbb][ccccc][ddddd][b]; echo $hairetsu_2[depday]; echo $hairetsu_2[cityname]; のように表示させる事は出来るのでしょうか? とんちんかんな質問だったらお許しください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 配列のインデックスを連番にしたい

    array 0 => 'aaaaa' (length=5) 2 => 'bbbbb' (length=5) 4 => 'ccccc' (length=5) 7 => 'ddddd' (length=5) 9 => 'eeeee' (length=5) 上記のような配列があった場合に、 インデックスを0からの連番にしたいのですが 何かいい方法はありますか? 以下のようにarray_reverseを二度使うという方法を 思いついたんですが、こういう使い方は何か変ですよね。。。 $field = array_reverse($field); $field = array_reverse($field); var_dump($field); array 0 => 'aaaaa' (length=5) 1 => 'bbbbb' (length=5) 2 => 'ccccc' (length=5) 3 => 'ddddd' (length=5) 4 => 'eeeee' (length=5)

    • ベストアンサー
    • PHP
  • 【Excel2007】A列の値がB列に存在しないことを確認したい

    いつもお世話になっております。 Excel2007を使用しております。 次のような一覧があります。 A列   B列 aaaaa aaaaa bbbbb bbbbb ccccc ddddd ddddd fffff eeeee A列にはあるが、B列にはない値を取得したいと 思っております。 この例であれば、「ccccc」と「eeeee」を抜き出したいのです。 何か関数などで抜き出す方法がございましたら、 教えて頂けませんか? A列、B列ともに2000行程度あるため、調査に苦労しています。 ぜひよろしくお願いいたします。

  • 秀丸のマクロでカラムごとの処理

    aaaaa,bbbbb,ccccc,ddddd,eeeee 上記のようなCSVファイルで、2カラム目のbbbbbと 4カラム目のdddddの文字を変換するという場合 どういったマクロになりますでしょうか? よろしくお願いします。

  • グーグルドキュメント(文書)で2列にする方法

    グーグルドキュメント(文書)で2列にしたいです。 横書きの場合。 左半分で、左上から始まり下にまでいく。 右半分の上にから始まり下までいくと、次のページ・・・ イメージだとこんなかんじです。 1枚目 aaaaa bbbbb aaaaa bbbbb aaaaa bbbbb aaaaa bbbbb aaaaa bbbbb aaaaa bbbbb aaaaa bbbbb aaaaa bbbbb 2枚目 ccccc  ddddd ccccc  ddddd ccccc  ddddd ccccc  ddddd ccccc  ddddd ccccc  ddddd ccccc  ddddd ccccc  ddddd

  • wordの段落を保持したままテキスト変換

    wordで作成した文書を、段落の見た目を保持したままテキストに変換する方法はないでしょうか? 段落がスペースに変換されるといいのですが、 コピー&ペーストですと行頭がそろってしまいます。 やりたいこと word文書 1.aaaaa  (1)bbbbb   ア.ccccc   イ.ddddd  (2)ddddd   ア.ccccc   イ.ddddd ↓ テキスト文書 1.aaaaa  (1)bbbbb   ア.ccccc   イ.ddddd  (2)ddddd   ア.ccccc   イ.ddddd コピー&ペーストの場合 word文書 1.aaaaa  (1)bbbbb   ア.ccccc   イ.ddddd  (2)ddddd   ア.ccccc   イ.ddddd ↓ テキスト文書 1.aaaaa (1)bbbbb ア.ccccc イ.ddddd (2)ddddd ア.ccccc イ.ddddd よろしくお願いいたします。

  • テーブルAにあって、テーブルBにないデータ抽出

    このようなデータのテーブルがあります。 テーブルA key ID ----------------- 1 AAAAA 2 BBBBB 3 CCCCC 4 DDDDD 5 EEEEE 6 FFFFF 7 GGGGG 8 HHHHH 9 IIIII テーブルB key ID ----------------- 1 AAAAA 2 CCCCC 3 EEEEE 4 FFFFF 5 HHHHH 6 IIIII 7 JJJJJ 8 KKKKK 9 LLLLL この場合テーブルAのIDの中で、テーブルBのIDには存在しない行を取り出すのに、プログラムを使わずに取得する方法はありますか? この例だと取得するはずの行は key ID ----------------- 2 BBBBB 4 DDDDD 7 GGGGG になります。 どうかよろしくお願いします。

    • ベストアンサー
    • MySQL
  • ExcelVBAでテキスト出力で最後の行に追記

    エクセルVBAで、すでに色々と書き込まれているテキストファイルがあり 一番最後の行に追記したいです。 具体的に下記のようなテキストにzzzzzzと追記して aaaaa bbbbb ccccc ddddd 下記のようにしたいです。 どのようにしたらよいのでしょうか? aaaaa bbbbb ccccc ddddd zzzzzz

  • ファイルを移動するためのバッチファイル

    テキストファイル(1行に1つのファイル名が書かれていて、ファイルの数だけの行があるテキスト)を読み込み それをもとに、パス指定した参照先ディレクトリより、1つずつファイルを取得し、 パス指定した保存先ディレクトリに保存していくという、ファイルを移動(コピー)するためのバッチファイルを作りたいのですが どのようなコマンドを記述すればよいでしょうか? (できれば、MS-DOSのバッチファイルだと助かります) 例 [list.txt] aaaaa bbbbb eeeee [参照先] aaaaa bbbbb ccccc ddddd eeeee ↓ [保存先] aaaaa bbbbb eeeee

  • shシェルスクリプト 空白行の入れ方

    TEST_STRING=" aaaaa bbbbb ccccc ddddd eeeee " echo "Result:" echo "$TEST_STRING" | grep ccccc 出力 ---------- Result: ccccc ---------- 上記のコードの 出力結果の前後に改行をいれたいのですが、いい方法はありませんか? 同様の該当コードが大量にあるため、 できるだけシンプルな方法を教えていただけないでしょうか? よろしくお願い致します。 期待する出力 ---------- Result: ccccc ----------

専門家に質問してみよう