文献リストの例に戻りましょう。文献リストは,通常,幾つもの文献が連なることでリストとなります。これを構造体を用いずに作成する場合,
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 のところで繰り返しから抜けるようにしています。