文字列の長さを取得するには strlen() を使う。
文字列の長さを取得する
#include <string.h> size_t strlen(const char *string);
引数
- string
文字列
戻り値
引数 string の長さ。長さにヌル文字は含まれない。
例
次のプログラムは変数 buf の文字列の長さを返す。
char buf[] = "Hello World!";
printf("%d\n", strlen(buf));
/* → 12 */マルチバイト文字の場合、その文字を表すのに必要なバイト数が返る
char 型の配列にはマルチバイト文字も格納できる。
マルチバイト文字とは、その文字を表すのに2バイト以上が必要な文字のことを言う。
半角以外の文字と覚えておけばまず良いだろう。
マルチバイト文字に対して strlen() を使った場合、その文字列を表すのに必要なバイト数が返される。
文字数ではないので間違えないように。
たとえば、次のプログラムを UTF-8 で保存して実行してみる。
半角文字、日本語、サロゲートペアの文字に対して strlen() がどんな値を返すか確認するプログラムである。
/* 半角文字 */
char str1[] = "A";
/* 日本語 */
char str2[] = "あ";
/* サロゲートペア */
char str3[] = "𠀀";
/* それぞれの変数に対して strlen() を実行 */
printf("str:[%s],len:[%d]\n", str1, strlen(str1));
printf("str:[%s],len:[%d]\n", str2, strlen(str2));
printf("str:[%s],len:[%d]\n", str3, strlen(str3));実行結果は以下のようになった。
- 半角文字 → 1バイト
- 日本語 → 3バイト
- サロゲートペア → 4バイト
str:[A],len:[1] str:[あ],len:[3] str:[𠀀],len:[4]
str:[A],len:[1] str:[あ],len:[2] str:[?],len:[1]
ヌル終端されていない文字列の場合、どうなるかわからない
ヌル終端されていない文字列を引数に指定したところ、strlen() は文字配列の要素数を超える長さを返した。
おそらく、たまたまこうなっただけで、環境や状況によって結果は変わってくるだろう。
char buf[128];
int i;
/* すべて a にしてヌル文字をなくしてみる */
for (i = 0; i < 128; i++) {
buf[i] = 'a';
}実行結果 ↓
文字配列 buf の長さは 128 だが、strlen() は 134 を返してきた。
strlen:134 string:"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa〈DC3〉';〈STX〉"
〈DC3〉、〈STX〉は制御文字を表す。