文献リストの例に戻りましょう。文献リストは,通常,幾つもの文献が連なることでリストとなります。これを構造体を用いずに作成する場合,
char author[100][60]; /* 著者 */ char title[100][80]; /* タイトル */ int year[100]; /* 発行年 */ char resource[100][120]; /* 出典元 */
とすることで,100件の文献からなる文献リストとなります。構造体が便利なところは,このような宣言をせずとも,構造体の中身を変えずに,オブジェクトを配列にすることで,リストを作成できることです。
/* Example 11.7 */ #include <stdio.h> #include <string.h> struct ref { char author[40]; /* 著者 */ char title[80]; /* タイトル */ int year; /* 発行年 */ char resource[120]; /* 出典元 */ } paper[100], book[100]; int main(void) { memcpy(paper[0].author, "J. von Neumann", sizeof(paper[0].author)-1); memcpy(paper[0].title, "Zur Theorie der Gesellschaftsspiele", sizeof(paper[0].title)-1); paper[0].year = 1928; memcpy(paper[0].resource, "Mathematische Annalen", sizeof(paper[0].resource)-1); printf("[AU] %s\n", paper[0].author); printf("[TI] %s\n", paper[0].title); printf("[YR] %d\n", paper[0].year); printf("[SO] %s\n", paper[0].resource); return 0; }
構造体 ref
自体に変化はありません。1つの文献に対し,それを構成する要素のみを指定しているのみです。その代わり,100件の文献が扱えるように,構造体の宣言において配列を指定しています。それが論文リスト paper[100]
や本のリスト book[100]
な訳です。構造体配列の個別要素は paper[i]
であり,それがもつメンバは paper[i].author
と言った具合になります。実行結果は次の通りです。
[AU] J. von Neumann [TI] Zur Theorie der Gesellschaftsspiele [YR] 1928 [SO] Mathematische Annalen
/* Example 11.8 */ #include <stdio.h> struct s { int n; char str[12]; } x[100] = { {1, "first"}, {2, "second"}, {3, "third"} }; int main(void) { int i; for (i = 0; x[i].n != 0; i++) printf("x[%d] %d\t%s\n", i, x[i].n, x[i].str); return 0; }
実行結果です。(丸括弧内はその文字の ASCIIコード番号です。)
x[0] 1 first x[1] 2 second x[2] 3 third
配列の初期化ルールを利用して,x[i].n
が 0
のところで繰り返しから抜けるようにしています。