Unsigned char *の長さをどのように決定しますか?
ポインターの実際のサイズ:
size_t s = sizeof(unsigned char*);
文字列の長さが必要な場合:
unsigned char* bla = (unsigned char*)"blabla";
int s = strlen((char*)bla);
これには2つの意味があります。ポインタ型の大きさを知りたいだけですか?もしそうなら、ジョスの答えは正しいです
size_t size = sizeof(unsigned char*);
ポインタが指す要素の数を知りたい場合は、少し複雑です。これがCスタイルの文字列である場合は、strlenまたは何らかのバリアントが最良のオプションです。
ただし、これがCスタイルの文字列とは関係のないunsigned charへの単なるポインタである場合、探しているものを確実に実現する方法はありません。 C/C++は、長さフィールドをポインターに関連付けません。ポインタで長さを渡すか、ポインタと長さの両方を格納するベクトルのようなクラスを使用する必要があります。
理想的な世界ではそうではありません。 Cスタイルの文字列(NULで終了し、長さを測定できます)にはchar *を使用し、バイトデータ(別のパラメーターなどに長さが付属しており、おそらくあなたがたどる)にのみunsigned char *を使用しますvector<unsigned char>
やbasic_string<unsigned char>
などのSTLコンテナをできるだけ早く。
根本的な問題は、charとunsigned charのストレージ表現が同じであるかどうかについてポータブルな仮定を立てることができないことです。彼らは通常そうですが、そうではありません。そのため、unsigned char *を操作する文字列のようなライブラリ関数はなく、char *だけを操作します。また、unsigned char *をsigned char *にキャストして結果を文字列として扱うのは、一般的に安全ではありません。 charは署名されている可能性があるため、これはunsigned char *をchar *にキャストしないことを意味します。
ただし、0は常にunsigned charとcharの同じ値表現です。したがって、理想的ではない世界で、どこかからCスタイルの文字列を取得したが、それが符号なしchar *として到着した場合、(a)それをchar *にキャストして続行しますが、(b )誰があなたにこれをしたかを見つけて、彼らに止めるように頼んでください。
C++を使用していて、その文字列をunsigned char *で記述している場合は、操作する前に、まずstd :: stringに配置することをお勧めします。そうすることで、あらゆる種類のことを実行でき、必要なときにいつでもlength()やcapacity()を取得できます。
私はあなたがその配列のサイズを一定ではないものにするために何かをしていると仮定しています。単に割り当て、設定、および忘れている場合は、配列の実際の割り当てサイズをいつでも別の変数に格納できます。より良いのは、構造体/クラスを作成することです。
//WARNING: memory issues not addressed here.
struct myStringStruct
{
unsigned char * string;
int len;
allocate(int size) {
len = size;
string = malloc(sizeof(unsigned char) * len);
}
}
それよりも複雑で、std :: stringを再発明しています。
cコードでコンパイルする場合、strlen()
関数パラメーターは“unsigned char*”;
ですが、C++コードでは、パラメーターは処理できません"unsigned char*";
したがって、c ++コードでコンパイルする場合は、強制的に変換する必要があります(unsigned char*)str.
ポインタの長さ(int)が必要ですか。ポイントされている文字列の長さが必要な場合は、strlenを使用します。ポインタのサイズ:sizeof(unsigned char *)文字列のサイズ:strlen(unsigned char *)マルチバイト文字は..multiバイトとして報告されます