[C/C++] テーブルデータ(配列)をfor文で巡回する方法

テーブルデータを巡回して、ある要素のデータを検索する場面は多々あると思います。
for文で配列の要素の先頭から終端までを巡回する方法について解説します。

スポンサーリンク

要素数を宣言している場合

要素数を宣言する場合は、その要素数を#defineで定義してfor文で使用できます。
以下に例を載せます。

#include <stdio.h>

// 配列の要素数を#defineで定義する
#define BUFFER_MAX	(5)

// 要素数の宣言では#defineで定義した定数名を使用する
int tbl[BUFFER_MAX] = { 1, 2, 3, 4, 5 };

int main(void)
{
	int i;

	// iが0~BUFFER_MAXになるまで巡回する
	for(i=0; i<BUFFER_MAX; i++){
		printf("data = %d\n", tbl[i]);
	}

	return 0;
}

実行結果:

data = 1
data = 2
data = 3
data = 4
data = 5

このように、要素数を#defineで定義していれば、途中でプログラムを変更する場合に、#defineだけを修正すればOKです。他の個所を修正する必要が無くなります。

要素数を宣言していない場合

要素数を宣言しない場合は、配列全体のバイト数と配列の型のバイトサイズをsizeof演算子で求めることで配列の要素数を算出することができます。
以下に例を載せます。

#include <stdio.h>

typedef struct _ST {
	char* name;  // 名前
	int  att;    // 攻撃力
	int  def;    // 防御力
}ST;

// 要素数を宣言していないテーブルデータ
ST tbl[] = {
	{ "コッコ隊長",   255, 255 },
	{ "コッコ副隊長", 100, 100 },
	{ "コッコ隊員A",   10,  10 },
	{ "コッコ隊員B",   15,   5 },
	{ "コッコ隊員C",    5,  15 }
};

// sizeof演算子でテーブルデータのバイトサイズと
// 構造体の型のサイズを求めて、
// 除算することで要素数を算出できる。
int tbl_size = sizeof(tbl) / sizeof(ST);

int main(void)
{
	int i;

	printf("要素数 = %d\n", tbl_size);

	for(i=0; i<tbl_size; i++){
		printf("名前 = %s\t攻撃力=%d\t防御力=%d\n",
			tbl[i].name, tbl[i].att, tbl[i].def);
	}

	return 0;
}

実行結果:

要素数 = 5
名前 = コッコ隊長 攻撃力=255 防御力=255
名前 = コッコ副隊長 攻撃力=100 防御力=100
名前 = コッコ隊員A 攻撃力=10 防御力=10
名前 = コッコ隊員B 攻撃力=15 防御力=5
名前 = コッコ隊員C 攻撃力=5 防御力=15

要素を識別するkeyとなるメンバーを持つ構造体の場合

先述の要素数を宣言していない構造体配列の場合で、要素を識別するkeyとなるメンバーが存在する場合は、そのkeyの値で終端を判断することができます。
先述の例では、必ず名前が存在するので、名前を持たない要素を終端に追加することで、「メンバーのnameがNULLになるまで」という条件で配列を終端まで巡回することができます。
以下に例を載せます。

#include <stdio.h>

typedef struct _ST {
	char* name;  // 名前
	int  att;    // 攻撃力
	int  def;    // 防御力
}ST;

// 要素数を宣言していないテーブルデータ
ST tbl[] = {
	{ "コッコ隊長",   255, 255 },
	{ "コッコ副隊長", 100, 100 },
	{ "コッコ隊員A",   10,  10 },
	{ "コッコ隊員B",   15,   5 },
	{ "コッコ隊員C",    5,  15 },
	{ NULL,             0,   0 }
};

int main(void)
{
	int i;

	for(i=0; tbl[i].name!=NULL; i++){
		printf("名前 = %s\t攻撃力=%d\t防御力=%d\n",
			tbl[i].name, tbl[i].att, tbl[i].def);
	}

	return 0;
}

まとめ

要素数を宣言する場合は#defineを使用して、
要素数を宣言しない場合はsizeofまたは、終端データに識別可能なデータを入れましょう。

sizeofを使用する方法と、終端データに識別可能なデータを入れる方法は、どちらもよく見る手法ですが、個人的にはsizeofを使用する方が、綺麗なコードに見えますので、sizeofを使用する方法を推奨します。

コメント