C言語には、配列要素の数を調べる機能の標準関数はありません。
配列に要素を入れるときに自分で数を数えておいて、その後はそれを使うケースが多いと思いますが、要素数を知る必要があるときは、サイズを調べる sizeof演算子を使って求めることができます。
配列の「サイズ」と「要素数」は違うので、まずそこを混同しないようにしましょう。
sizeof (型名) 指定した型名のバイトサイズを求める(サイズは環境に依存します) sizeof 変数名 指定した変数のバイトサイズを求める。変数では()を省ける。下のような配列があるとすると
int score[] = { 88, 80, 92, 67, 78 }; double weight[] = { 56.7, 78.3, 60.2 };配列の要素数は、「配列のサイズ / ひとつの要素のサイズ」の式で求めることができます。
printf( "scoreの要素数 %d\n", sizeof score/sizeof(int) ); printf( "weightの要素数 %d\n", sizeof weight/sizeof(double) );scoreの要素数は 5、weightの要素数は 3 と分かります。 下のように、define することもできます。
#define NSCORE ((sizeof score)/(sizeof(int))) #define NWEIGHT ((sizeof weight)/(sizeof weight[0]))2つめの define のように、「ひとつの要素のサイズ」は「配列の先頭要素のサイズ」と書くことができます。
※ 文字配列の場合上のような方法で要素の数を調べることは一般にありません。 この話題はまた次の機会に ・・・。
(今回のクイズです)
#include <stdio.h>
#define NARTIST /* 構造体配列guestsの要素の数を求める */
struct artist_st {
int order; //出演順
char name[24]; //アーティスト名
};
main()
{
struct artist_st guests[] = { { 5, "Eric Clapton" }
, { 2, "Lady Gaga" }
, { 4, "Madonna" }
, { 1, "Red Hot Chili Peppers" }
, { 3, "Sting" } };
printf( "出演アーティスト数は %d\n", NARTIST );
}
guests配列の要素数を調べ、出演アーティスト数として表示しようとしていますが、define の定義がコメントになっています。
[ 関連記事 ] 文字列長と配列サイズの使い分け
printf("小数点以下第2位で四捨五入 = %g\n", shishagonyu( d*10.0 )/10.0 );10倍して shishagonyu に渡し、返ってきた結果を 10.0 で割って元の位に戻します。