法大奥山研究室

 previous  contents

11.3. 構造体配列


 文献リストの例に戻りましょう。文献リストは,通常,幾つもの文献が連なることでリストとなります。これを構造体を用いずに作成する場合,

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].n0 のところで繰り返しから抜けるようにしています。


 previous  contents