web-dev-qa-db-ja.com

文字列サイズをバイト単位で取得する方法は?

タイトルが示すように、私の質問はCで文字列のサイズを取得する方法です。 sizeofを含まない関数で(文字列)を宣言した場合、mallocを使用するのは良いですか?または、ポインターとして宣言した場合はどうなりますか? mallocで初期化した場合はどうなりますか?徹底的な対応をしたいと思います。

24
artaxerxe

strlen を使用できます。サイズは終端のヌル文字によって決定されるため、渡された文字列は有効である必要があります。

あなたの文字列を含むメモリバッファのサイズを取得したい場合、それへのポインタがあります:

  • (mallocで作成された)動的配列の場合、コンパイラがどのポインターを指しているのかわからないため、サイズを取得することはできません。 ( チェックしてください
  • 静的配列の場合、sizeofを使用してサイズを取得できます。

動的配列と静的配列の違いについて混乱している場合は、 this を確認してください。

42
nmikhailov

strlen を使用して、nullで終わる文字列の長さを取得します

sizeofは、文字列ではなくarrayの長さを返します。ポインターの場合(char *s)、配列ではありません(char s[])、ポインタのサイズ(32ビットシステムでは通常4バイト)を返すため、機能しません。配列はポインターとして渡されるか返されると考えているため、sizeofを使用して配列のサイズを確認する機能は失われます。

そのため、文字列が配列全体に及ぶ場合のみ(例:char s[] = "stuff")、静的に定義された配列にsizeofを使用すると、必要なものが返されます(必要ないので高速になります)ループスルーしてヌルターミネーターを見つけます)(最後の文字がヌルターミネーターの場合、1を引く必要があります)。配列全体に及ばない場合は、必要なものが返されません。

これらすべてに代わる方法は、実際に文字列のサイズを保存することです。

13
Dukeling

sizeofはこの特定のタイプの文字列に対して機能しますが:

_char str[] = "content";
int charcount = sizeof str - 1; // -1 to exclude terminating '\0'
_

strがポインター(sizeofがポインターのサイズ(通常は4または8)を返す)または指定された長さの配列(sizeofが指定された長さに一致するバイトカウントを返す場合、動作しません、char型の場合は同じです)。

strlen()を使用してください。

10
hyde

sizeof() thenを使用すると、char *strchar str[]は異なる答えを返します。 char str[]は文字列の長さ(文字列ターミネータを含む)を返し、char *strはポインタのサイズを返します(コンパイラごとに異なります)。

3
Aniket Bhanja

私は使用したい:

_(strlen(string) + 1 ) * sizeof(char)
_

これにより、バイト単位のバッファサイズが得られます。 snprintf()でこれを使用すると、次の場合に役立ちます。

_const char* message = "%s, World!";
char* string = (char*)malloc((strlen(message)+1))*sizeof(char));
snprintf(string, (strlen(message)+1))*sizeof(char), message, "Hello");
_

乾杯!関数:size_t strlen (const char *s)

2
A.Clymer