配列の中にいくつ要素があるか後から調べる方法はあるでしょうか?
int test[4][3] = {
{0,1,2},
{0,1,2},
{0,1,2},
{0,1,2},
} ;
上のケースだと、X方向に3、Y方向に4つの
要素があります。しかし、これだとあらかじめいくつ要素があるかを決めて
置かないといけません。
例えば、
int test[] = {0,1,2,3....}
みたいに宣言された場合や、
char *test[] = {
"ああああああ",
"いいいいいい",
"うううううう",
・
・
//(これは文字列の数を要素数とします)
} ;
のように宣言された二次元配列などで、後から配列内にいくつ要素があるかを
調べることなどは可能でしょうか?
No.4
- 回答日時:
よくやるやり方では、
char test[] = {0,1,2,3,0xFF};
と書いて0xFFを番兵として使うとか。具体的には
for(i=0; 0xFF!=test[i]; i++)
;
というループを回した後出てくる i が配列の要素数です。
上記の例では、i=4のときtest[4]==0xFFとなり、配列の(使いたい)要素数が4個であることが分かります。
char *test[] = {
"ああああ",
"いいいい",
"うううう",
NULL
};
でも
for(i=0; NULL!=test[i]; i++)
;
で同じこと。
このやり方を応用すれば、
#define COMMAND_STRING_SIZE6
typedef void (*func)(void);
typedef struct {
charcommandString[COMMAND_STRING_SIZE];
funccommandFunction;
} FUNCTIONMENU;
void func1(void){puts("hogeです。");}
void func2(void){puts("fugaです。");}
FUNCTIONMENUmenuTable[] = {
{"hoge",func1},
{"fuga",func2},
{"quit",NULL},
{NULL,NULL}
};
という感じで、コマンド入力に対して実行する関数をテーブル管理する際に、コマンドを増やすのはテーブルに追加するだけで済みます。
Javaなら、配列名.length(); で一発なんですけどね~
No.3
- 回答日時:
前の回答者様も軽く触れられていましたが、sizeofの使い方には注意が必要です。
int a[] = {1,2,3,4,5,6,7,8};
int *b = NULL;
b = (char*)a;
ここで、sizeof(a/a[0])とsizeof(b/b[0])がそれぞれどのような値になるか確かめてください。なんでそうなるかは、型に注意してよく考えてみてください。
上の問題は、ローカル定義の配列をパラメータで渡すように変更した場合にありがちなバグを引き起こします。
C言語の場合には、使用しているメモリのサイズは明示的に管理すべできです。つまり、
#define MAX_A (8)
#define SENTITIES (-1)
...
int array[MAX_A+1] = {1,2,3,4,5,6,7,8, SENTITIES};
rc = func( (int*)array, MAX_A );
if ( 0 != rc ) {
//エラー処理
}
...
int func( int* array, int num ) {
int cnt;
assert( NULL != array );
assert( SENTITIES == *(array+num) );
for ( cnt = 0 ; cnt < num ; cnt++ ) {
...
}
...
}
最後に尖兵をつけて、妥当性検査(最低限アサーション)を行っておくと、よい(防衛的な)プログラミングになります。
他の言語でもそうですが、特にC言語ではこのように明示的に管理するプログラミングの癖をつけておけるかどうかが、品質と生産性に大きく影響してきます。
No.2
- 回答日時:
#define ArraySizeOf(array) (sizeof(array) / sizeof(array[0]))
↑任意の配列 array[] の要素数を返すマクロです.
こういうのを作っておくと便利です.
ご質問の例だと,
int test[] = { … };
int i;
for(i = 0; i < ArraySizeOf(test); i++)
printf("…", test[i]);
のように使えます.
念のためにいっておきますが,array は配列でなければならず,配列へのポインタではだめです.
また,ArraySizeOf() は関数にはできません.
(たまに間違えてる人を見かけるので.)
参考URL:http://www5d.biglobe.ne.jp/~noocyte/Programming/ …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Java Java・配列の問題です。 int 「」nums = new int「5」 ⤴︎ この5の事を言葉で 2 2023/06/21 22:30
- Visual Basic(VBA) Vba 配列の中の特定文字列の位置の調べ方 9 2022/05/23 17:46
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- Visual Basic(VBA) VBAで大量データの処理 3 2022/11/15 21:53
- JavaScript 二次元配列の全要素の全要素を区切り文字無しで連結する最も単純な書き方を教えてください 3 2023/06/09 12:51
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
構造体のextern方法
-
C言語において、 配列要素をひ...
-
C#でのフィボナッチ数列
-
C言語の2次元配列 容量が大き...
-
C#で配列が空かを判定するには?
-
配列のアドレス部
-
char型配列をint型に代入するには
-
2番目の最大値を求める
-
C言語の課題が出たのですが自力...
-
C言語についてです 5人のテスト...
-
C言語から質問です。
-
C言語 ファイルの指定された行...
-
c言語 構造体
-
コンボボックスでデフォルト値...
-
MFCのCArrayを使った二次元配列
おすすめ情報