- ベストアンサー
unsigned char の配列で途中で0を含む時のstrlen
表題のようにunsigned char a[10]; の配列で、文字列ではなくデータとして扱っている時、どうしても途中で0が混じります。そこでstrlen(a) を取ると途中までの長さの値しか取れません。 sizeof(a) としてもunsigned char のsize=4 になるだけです。 この回避策はあるでしょうか。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
No.3の補足に対してですが、 > このような場合、関数部から呼び出し側のsize取得は無理ですか? 無理です。 理由は配列を関数に渡したときそれはポインタに格落ちして サイズに関する情報を失うからです。 この場合は -------------実行部本体 unsigned char a[10]; ret = func_b(a, sizeof(a)/sizeof(a[0])); ・ ・ ・ -------------関数部 int func_b(unsigned char a[], size_t size) { sizeを利用した処理 } とするのが普通だと思います。
その他の回答 (6)
- Trick--o--
- ベストアンサー率20% (413/2034)
・a[i]の値はランダムで、いつ0が入るかわからない ・strlenで9(この場合最後に\0が入るので)以外の時に戻り値でエラーコードを返したい んむ? if(strlen(a) != 9) /* error */; else /* ok */; てゆこと? コレじゃダメなの? 途中で0x00が入る=文字列が終わる、だよ? ヌル文字列が使えないというのなら、データ数(=strlen?の値)を引数か何かでもらうしかないよね。
- Trick--o--
- ベストアンサー率20% (413/2034)
strlenは'\0'で終わる文字列の長さを取得する関数です。 unsigned char a[10]; int len = sizeof(a)/sizeof(unsigned char); としても、取得できるのは配列の要素数10です。 んなもんは #define MAX_SIZE 10 unsigned char a[MAX_SIZE]; int len = MAX_SIZE; としたって同じです。 求めたい"長さ"の定義にそってカウントする関数を自分で作ればよいでしょう。
- galluda
- ベストアンサー率35% (440/1242)
がると申します。 ちとあちこち混乱しているようなので、情報の整理をいたします。 まず、 unsigned char a[10]; と宣言されている配列において、「aという配列のサイズ」は確かに#2さん#3さんのおっしゃるとおり10になります(取得方法は sizeof を使用)が、多分質問者さん的には、別に配列のサイズそのものは要求されていないかと思われます。 で、質問者さんが欲しいのは 「データに0x00が混ざる場合に、そのデータの長さをstrlenで取得したいのだが、どうしてもうまくとれない」という内容になるかと思うのですが。 結論からいうと「無理」です。 strlenは「文字の長さを数える」ものであり、C言語及びC++において、0x00は「文字列の終端」を意味するので、どうしてもそこで止まってしまいます。 もしC言語をお使いであれば構造体を、C++をお使いであればクラスを用いるのがもっともよいかと思われるのですが。 またご質問コメントなどいただければ、わからない部分について捕捉いたしますのでお気軽にお書きください ^^
補足
ちょっと説明します。 #No.3の補足にあるような形式で、条件としては ・関数部は自分が作るが、呼び出し部は他人が作り、こちらからは指定できない ・a[i]の値はランダムで、いつ0が入るかわからない ・strlenで9(この場合最後に\0が入るので)以外の時に戻り値でエラーコードを返したい と言う事になります。 言語はCですので構造体を使うしかないでしょうか。
- chie65536
- ベストアンサー率41% (2512/6032)
本当に unsigned char a[10]; と宣言しているなら、sizeof(a)は10になります(但しunsigned charが1バイトの処理系のみ) 配列のように使用しているが、ポインタで unsigned char *a; と宣言しているなら、sizeof(a)は4になります(但しポインタが32ビットの処理系のみ) なお、sizeofは(その処理系で)必要になるメモリ領域のバイト数を返すので、バイト数ではなく要素数を調べる場合は (sizeof(配列変数名)/sizeof(要素の型)) になりますので (sizeof(a)/sizeof(unsigned char)) と書きます。
補足
回答ありがとうございます。 ちょっとややこしいんですが、 -------------実行部本体 unsigned char a[10]; ret = func_b(a); ・ ・ ・ -------------関数部 int func_b(unsigned char a[]) { sizeof(a); } ------------- としています。 このような場合、関数部から呼び出し側のsize取得は無理ですか?
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>size=4 になるだけです。 おそらく、ポインタを使っていませんか? unsigned char a[10]; の様に宣言した 配列としてのa を使っていれば 4 にはならないはずです。 sizeof(a) または、 sizeof(a)/sizeof(unsigned char) とします。 配列のサイズを得るためにstrlen は、使用できません
- Chronos198
- ベストアンサー率30% (105/349)
どのようなデータの格納される配列で、どのような条件でデータの終端と判断するのでしょう? それがわからなければどうにもなりません。 というか、それがわかるなら長さを返す関数を作ってしまっては?
補足
回答ありがとうございます。 この方法でいこうと思います。