C++では、文字列の長さを取得する方法は使用している文字列の種類によって異なります。
主に次の2種類の文字列が使われます。
- C++標準ライブラリの文字列(
std::string) - C言語スタイルの文字列(
char[]やchar*)
これらは内部の仕組みが異なるため、長さを取得する方法も変わります。
それぞれの特徴を理解しておくことが重要です。
std::string の長さを取得する方法
現代のC++では、文字列を扱う際には std::string を使用するのが一般的です。
std::string の長さは次の2つの関数で取得できます。
size()length()
この2つは どちらも同じ値を返す関数であり、実質的に同じ役割を持っています。
size() と length() の違い
動作自体は同じですが、名前の意味には次のような違いがあります。
| 関数 | 意味 |
|---|---|
| size() | コンテナの要素数 |
| length() | 文字列の長さ |
C++の標準ライブラリでは、配列やベクターなど多くのコンテナが size() を使うため、コードの統一性の観点から size() を使うことが多いとされています。
ただし、length() を使用しても問題はありません。
戻り値の型
これらの関数が返す値は通常 std::size_t という型です。
これは符号なし整数型であり、負の値になることはありません。
C言語スタイル文字列の長さを取得する方法
C言語スタイルの文字列(char[] や char*)では、長さを取得するために strlen() という関数を使用します。
C言語の文字列は、文字列の終わりに 終端文字 '\0'(ヌル文字) が必ず付いています。
strlen() は、この終端文字が現れるまで文字を数えることで文字列の長さを求めます。
計算量の特徴
strlen() は文字列の先頭から順番に文字を調べていくため、一般的に O(n) の計算量になります。
つまり、文字列が長い場合や、ループの中で何度も strlen() を呼び出す場合には処理効率に影響が出る可能性があります。
一方で、std::string の長さ取得は内部に長さ情報が保持されているため、通常は O(1) で取得できます。
sizeof との違い
sizeof は文字列の長さを取得するための機能ではありません。
これは 配列や型のサイズ(バイト数)を取得する演算子です。
例えば、文字配列として文字列が定義されている場合、sizeof は配列全体のサイズを返します。
このサイズには 終端文字 '\0' も含まれるため、文字列の実際の長さより1大きくなることがあります。
また、sizeof は配列ではなく ポインタに対して使用するとポインタ自体のサイズを返します。
そのため、ポインタを使っている場合には文字列の長さを取得することはできません。
日本語文字列を扱う場合の注意点
std::string は基本的に バイト列を格納するコンテナです。
そのため、日本語などのマルチバイト文字を扱う場合には注意が必要です。
UTF-8では、日本語の多くの文字は 複数バイト(一般的には3バイト)で表現されます。
そのため、文字列の長さを取得すると 見た目の文字数ではなく、バイト数が返されることがあります。
つまり、日本語の5文字の文字列でも、UTF-8では15バイトとして扱われることがあります。
この点はC++の文字列処理で非常に重要なポイントです。
まとめ
C++で文字列の長さを取得する主な方法は次の通りです。
| 方法 | 対象 | 意味 |
|---|---|---|
string.size() | std::string | 格納されている要素数 |
string.length() | std::string | sizeと同じ値 |
strlen() | C文字列 | 終端文字までの長さ |
sizeof | 配列 | 配列全体のサイズ |
実務での一般的な使い方
現代のC++では、安全性や使いやすさの観点から std::string を使用するのが一般的です。
文字列の長さを取得する場合も、std::string の size() または length() を使うことが多いです。
以上、C++の文字列の長さの取得方法についてでした。
最後までお読みいただき、ありがとうございました。
