strlen関数とは
strlen関数は、文字列の長さを調べるための関数です。C言語の標準ライブラリに含まれています。
プログラムで文字列を扱う際、「この文字列は何文字あるのか?」という情報を知りたい場面はよくあります。
そんなときに使うのがstrlen関数です。文字列の長さはメモリ管理やデータ処理において、非常に重要な情報となります。
strlen関数を使うには、string.hというヘッダーファイルを最初に読み込ませておく必要があります。
strlen関数の定義と戻り値
strlen関数は、文字列の先頭アドレス(ポインタ)を受け取り、その文字列の長さを返します。
基本的な書き方は次の通りです。
各要素の意味を確認しておきましょう。
- size_t:戻り値の型(文字数を表す)
- const char *s:引数(文字列が格納されたchar型配列のポインタ)
strlen関数の基本的な使用例を見てみます。
出力結果
文字列の長さ: 6まず着目して欲しいのは、#include <string.h>でstrlen関数を使えるようにしているという点です。
strlen関数を使うために、必要な記述になります。
「あれ?文字列の長さが2じゃない……」と思った方もいるでしょう。
実は、厳密にいうとstrlen関数はバイト数を数えるのです。一般的に、日本語の文字(通常使われるUTF-8エンコーディングの場合)は、1文字が3バイトで構成されます。
「ネコ」は日本語なので、バイト数が6と表示されるというわけです。
ちなみに、今回のコード例では基本的な書き方にある構造はどこにも出てきていません。
それは、printf関数の中でstrlenの結果が%lu(符号なし長整数型)という書式指定子で受け取られているためです。
別の言い方をすると、size_t型の変数に代入せずに、printf関数の中で直接出力しているということですね。
文字列長と終端文字の関係
C言語には、文字列の「終わり」を示す特別な文字であるNULL文字(\0) が存在します。strlen関数は、このNULL文字に到達するまでの文字だけを数えるという仕組みです。
例えば、「ABC」という文字列は、実際にはメモリ上で次のように格納されています。
'A' 'B' 'C' '\0'文字列の長さを数える際、NULL文字自体は文字数には含まれません。この場合、strlen関数は\0は含まずに3を返すというわけです。
ちなみに、文字列の途中で処理を打ち切りたい場合には、NULL文字をコードに意図的に含めることで実現できます。
実際に確認してみましょう。
出力結果
文字列: イヌ
文字数: 6\0を消した後の挙動も確認してみてください。
strlen関数の使い方とコード例
ここからは、strlen関数を実際に使う方法を学んでいきます。
文字列の格納方法には、char型の配列を使う方法と、ポインタを使う方法があります。
どちらの方法でもstrlen関数は使えますが、少し違いがあります。具体的なコード例を通して、それぞれの使い方を見ていきましょう。
char配列とstrlenの利用例
char型の配列に文字列を格納した場合の使い方です。
配列は、あらかじめ決めたサイズのメモリ領域を確保して、そこに文字列データを保存します。
例えば、char zoo_animal[50]と書くと、50文字分のスペースが確保されます。
出力結果
動物名: ライオン
文字数: 12文字配列のサイズ(この例では50)と、実際に格納されている文字列の長さ(12)は別物です。
strlen関数は実際に格納されている文字列の長さだけを返します。
ポインタとstrlenの利用例
ポインタ変数を使って文字列を扱う場合の使い方です。
ポインタは、文字列リテラル(プログラム中に直接書かれた文字列)のアドレスを保持します。
char *farm_animal = "ウシ";のように書くと、ポインタfarm_animalが文字列「ウシ」の場所を指し示すようになります。
出力結果
ウシ: 6文字
ニワトリ: 12文字*(アスタリスク)は、これがポインタであることを示しています。「〜を指す」という意味です。
配列とポインタは、次のような用途によって使い分けましょう。
- 配列:文字列の内容を後から変更したい場合
- ポインタ:変更しない固定の文字列をそのまま使いたい場合
strlen使用時の注意点
strlen関数を使う際に、いくつか重要なポイントがあります。
この注意点を理解していないと、プログラムが正しく動かなかったり、予期しないエラーが発生したりする可能性があります。
特に、sizeof演算子との違い、日本語の扱い、無効なポインタの問題については、しっかり理解しておきましょう。
sizeofとの違い
strlen関数とsizeof演算子は、どちらも数値を返しますが、その意味は全く違うものです。
- strlen関数:実際に格納されている文字列の長さ(文字数)を返す
- sizeof演算子:配列全体のサイズ(バイト数)を返す
文字列の長さが配列サイズより小さい場合、この違いはかなり大きくなります。
実際に、違いを確認してみましょう。
出力結果
strlen: 9
sizeof: 100文字列の長さを知りたい場合はstrlen関数を使い、配列のメモリサイズを知りたい場合はsizeof演算子を使いましょう。
日本語(マルチバイト文字)とstrlen
strlen関数で日本語を扱う際には、注意が必要です。その理由は、ここまでの例をみてきたことからもわかるかと思います。
strlen関数は「文字数」ではなく「バイト数」を返すからです。
日本語の文字は、通常1文字につき2バイト以上(UTF-8では3バイト)を使用します。
出力結果
日本語文字列: サル
バイト数: 6ここまでの例を振り返ってみても、日本語1文字につき3バイト使用していることがわかると思います。
ヌルポインタを渡した場合の問題
strlen関数にNULLポインタ(無効なポインタ)を渡すと、プログラムがクラッシュする危険性があります。
strlen関数は、渡されたポインタが有効かどうかをチェックしません。
そのため、無効なポインタを渡すと、不正なメモリアクセスが発生し、プログラムが異常終了してしまいます。
strlen関数を使う前に、必ずポインタが有効(NULLでない)かをチェックしましょう。
次のコードは、安全なチェック例です。
出力結果
無効なポインタですこのコード例のポイントは次の3つです。
- animalにNULLが代入されている
- if (animal != NULL)でポインタが有効かをチェックしている
- ポインタがNULLの場合は、strlen関数を呼ばずにエラーメッセージを表示する
ポインタを使う際は、「このポインタは有効か?」ということを確認する癖をつけましょう。プログラムのクラッシュを未然に防ぐためには大切なことです。
strlen関数と他の関数
strlen関数は、他の文字列処理関数と組み合わせて使うことが多々あります。
特に、文字列をコピーしたり結合したりする際には、事前に文字列の長さを知ることで、より安全で効率的なプログラムが作れます。
また、strlen関数の仕組みを理解するために、自分で同じ機能を作ってみることも、学習に非常に役立つでしょう。
strcpy・strcatとの関連
文字列をコピーするstrcpy関数や、文字列を結合するstrcat関数を使う際、strlen関数で事前に長さを確認することが重要です。
なぜ長さの確認が必要かというと、配列のサイズを超えて文字列をコピーしたり結合したりすると、バッファオーバーフローという深刻なエラーが発生するからです。
これを防ぐために、strlen関数で長さをチェックします。
バッファオーバーフローとは、 配列の範囲を超えてデータを書き込んでしまうエラーです。プログラムのクラッシュやセキュリティ上の重大な問題を引き起こすエラーのため、確実に対処しましょう。
安全な文字列結合の例を見てみましょう。
出力結果
結合結果: イヌとネコこのコード例のポイントは次の4点です。
- pets配列は50バイトのサイズがある
- strlen(pets) + strlen(add_pet)で、結合後の長さを計算している
- < 49で比較しているのは、NULL文字(\0)の分を1バイト残すため
- 安全なサイズであることを確認してから、strcatで文字列を結合している
配列サイズから1を引いた値で比較するのは、NULL文字の分を考慮しているためです。覚えておきましょう。
自作でstrlen関数の機能を実装してみよう
strlen関数の仕組みを深く理解するために、同じ機能を持つ関数を自分で作ってみましょう。
strlen関数の動作原理は、こうです。
- 文字列の先頭から1文字ずつ見ていく
- NULL文字(\0)が見つかるまでカウンターを増やす
- カウンターの値を返す
実際に自作してみましょう。
出力結果
文字列: ゾウ
長さ: 6自作部分のコードの構造を見てみましょう。
- my_strlenという名前で、strlen関数と同じ機能を持つ関数を作成している
- カウントを初期化している
- count変数で文字数を数えている
- while (str[count] != '\0')で、NULL文字が見つかるまでループする
- ループの中でcount++により、カウンターを1ずつ増やす
- 最後にcountの値を返す
自分で実装してみることで、プログラムがどのように動作しているのかを深く理解できます。
この例でいうと、strlen関数は、文字列を最初から最後までスキャンしているということや、NULL文字が文字列の終端を示す重要な役割を果たしていることなどがわかったはずです。
ちなみに、自作であるがゆえに、他のすべてのコード例と明らかに違う点がありますね。
そうです。#include <string.h>が記述されていません。
よくある質問(Q&A)
Q: strlen関数にヘッダーファイルは必要?
A: はい、string.hのインクルードが必要です。
このヘッダーファイルにstrlen関数のプロトタイプ宣言が含まれているため、使用前に必ず#include <string.h>を記述してください。
Q: 空文字列の場合strlenは何を返す?
A: 空文字列("")の場合、strlen関数は0を返します。
空文字列は文字が何もない状態で、最初の文字がNULL文字となるためです。
Q: 文字列に改行文字が含まれる場合は?
A: 改行文字(\n)も通常の文字として扱われ、文字数にカウントされます。strlen関数は、NULL文字以外のすべての文字を数えるからです。
Q: 数値が文字列として格納されている場合は?
A: 数値であっても文字列として格納されていれば、strlen関数は文字数を返します。
例えば"123"という文字列なら、長さは3となります。数値の値ではなく、文字としての長さが取得されます。
Q: 配列の一部だけ使用している場合は?
A: 配列サイズに関係なく、実際に格納されている文字列の長さが返されます。
配列の未使用部分は計算に含まれません。NULL文字までの文字数のみがカウントされるためです。
まとめ
C言語のstrlen関数は、文字列の長さを調べるための重要な関数です。
この記事では、strlen関数の基本的な使い方から、実際に使う際の注意点まで解説してきました。
strlen関数が特に有用なのは、次のような場面です。
strlen関数が活躍する場面
- 文字列のコピーや結合の前にサイズをチェックしたいとき
- ユーザー入力の文字列の長さを検証したいとき
- 有効な文字列であることをチェックしたいとき
- 配列のサイズ(sizeof)と、実際に格納されている文字列の長さを比較したいとき
最後に、重要なポイントをおさらいしましょう。
重要なポイント
- strlen関数は、文字列のバイト数を取得する標準ライブラリ関数
- NULL文字(\0)までを数えるが、カウントには含まない
- strlenは実際の文字列長、sizeofは配列全体のサイズを返す
- 日本語は1文字につき、3バイトである
- 無効なポインタを渡すとクラッシュするため、必ず有効性をチェックする
strlen関数を正しく理解して使うための最も大切なことは、実際にコードを書いて試してみることです。
特に、最初のうちは#include <string.h>を書くのを忘れたりstrlenとsizeofを混同したりすることもあるかもしれません。慣れてくると、体に染み付いてきます。
strlen関数は、文字列処理の基礎中の基礎です。多くのプログラムで文字列を扱うため、この関数をしっかり理解しておくことは非常に重要です。
プログラミングをもっと体系的に学びたい方には、paizaラーニングがおすすめです。実践的な演習問題を通して、strlen関数をはじめとするC言語の文字列処理を着実に身に付けることができます。