strlen() と sizeof() の違い - 文字列の長さを取得する正しい方法は?
C言語における sizeof("string") の出力
C言語において、sizeof("string")
の出力は正しいでしょうか?
答え:
C言語における sizeof("string")
の出力は、文字列リテラル "string" の終端文字 '\0' を含めたバイト数となります。
解説:
C言語において、文字列リテラルはダブルクォーテーションで囲まれた文字列です。例えば、"string" という文字列リテラルは、以下のようになります。
"s" "t" "r" "i" "n" "g" "\0"
最後の '\0' は文字列終端文字と呼ばれ、文字列の終わりを示します。
sizeof
演算子は、オペランドのサイズ(バイト単位)を返します。sizeof("string")
は、文字列リテラル "string" のサイズを返します。これは、文字列リテラル内の文字数 + 1(終端文字 '\0' のため)となります。
例:
#include <stdio.h>
int main() {
printf("%d\n", sizeof("string"));
return 0;
}
このプログラムは、以下のように出力されます。
7
これは、"string" という文字列リテラルが7バイト(6文字 + 1終端文字)であることを示しています。
注意事項:
sizeof
演算子は、配列の要素数ではなく、配列全体のサイズを返します。- 構造体の sizeof 演算子は、構造体内のすべてのメンバーのサイズを合計した値を返します。
関連用語:
- C言語
- sizeof
- 文字列リテラル
- 終端文字
#include <stdio.h>
int main() {
// 文字列リテラル
char str[] = "Hello, world!";
// sizeof("Hello, world!") の出力
printf("sizeof(\"Hello, world!\") = %d\n", sizeof(str));
// strlen("Hello, world!") の出力
printf("strlen(\"Hello, world!\") = %d\n", strlen(str));
return 0;
}
sizeof("Hello, world!") = 14
strlen("Hello, world!") = 13
sizeof(str)
は、文字列リテラル "Hello, world!" を含む配列str
のサイズを出力します。これは、文字列リテラル内の文字数 + 1(終端文字 '\0' のため)となります。strlen(str)
は、文字列リテラル "Hello, world!" の終端文字 '\0' を除いた文字数を出力します。
sizeof("string") の出力を取得する他の方法
strlen()
関数は、文字列リテラルの終端文字 '\0' を除いた文字数を返します。
#include <stdio.h>
int main() {
char str[] = "Hello, world!";
int len = strlen(str);
printf("文字列 \"%s\" の長さは %d です。\n", str, len);
return 0;
}
出力:
文字列 "Hello, world!" の長さは 13 です。
手動で文字数をカウントする
文字列リテラル内の文字数を手動でカウントすることもできます。
#include <stdio.h>
int main() {
char str[] = "Hello, world!";
int len = 0;
while (str[len] != '\0') {
len++;
}
printf("文字列 \"%s\" の長さは %d です。\n", str, len);
return 0;
}
文字列 "Hello, world!" の長さは 13 です。
マクロを使用する
以下のようなマクロを使用して、sizeof("string")
の出力を取得することができます。
#define STRING_SIZE(str) (sizeof(str) - 1)
int main() {
char str[] = "Hello, world!";
int len = STRING_SIZE(str);
printf("文字列 \"%s\" の長さは %d です。\n", str, len);
return 0;
}
文字列 "Hello, world!" の長さは 13 です。
- これらの方法は、C言語以外の言語では使用できない場合があります。
- これらの方法は、文字列リテラル内の文字数のみをカウントします。文字列リテラルの終端文字 '\0' はカウントされません。
c language-lawyer sizeof