怠日記

写真・金魚・昆虫・プログラミングの趣味を語るサイトです。似たようなことをnoteにも書いたり書いてなかったり。

C言語 - 文字列の長さを取得する | strlen()

文字列の長さを取得するには 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]

ちなみに UTF-8 ではなくシフトJISで保存して実行すると次のようになる。

  • 半角文字 → 1バイト
  • 日本語 ⇒ 2バイト
  • サロゲートペア ⇒ シフトJISで表現できず “?” となるため1バイト
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〉は制御文字を表す。