HOWTO · C++

C++ で文字列の長さを求める

この記事では、C++ で文字列の長さを求める方法を紹介します。length() や size() といった組み込み関数や、カスタムループによる方法など、さまざまな手法を取り上げます。実践的なコード例と詳しい説明を通じて、C++ プログラムで文字列データを効果的に扱う方法を学びましょう。

このページの内容

std::string については、length() または size() を呼び出して、格納されている char 要素の数を取得します。この 2 つのメンバ関数は同じ数を返します。たとえば、文字列 "Hello, C++!" には 11 個の要素があります。

#include <iostream>
#include <string>

int main() {
    const std::string message = "Hello, C++!";
    std::cout << message.length() << '\n';
}
11

以下の例では、標準 C++ ヘッダーと単独の main 関数を使用します。各出力は、その例が印字する数を表示します。

length() で std::string の長さを取得する

文字列に格納されている要素の数を知りたい場合は length() を使用します。これは、文字列内の char 要素の数を返します。その数には、格納された値の一部である埋め込みのヌル要素も含まれます。C 文字列関数のように最初の \0 で止まることはありません。

結果は char 要素の数であり、ユーザーが知覚する文字数や Unicode コードポイントの数とは限りません。UTF-8 テキストでは、表示される 1 文字に複数の char 要素を使うことがあります。文字列の格納された長さには length() を使用し、タスクにテキスト文字の数が必要な場合は、Unicode に対応した操作を選んでください。

size() で std::string の長さを取得する

size() は、std::string に対して length() と同じ数を返します。可読性や周囲のコードに応じてどちらの綴りを選んでもかまいません。パフォーマンスのために一方を優先する必要はありません。size() は標準コンテナでもよく使われ、要素の数を報告します。

#include <iostream>
#include <string>

int main() {
    const std::string language = "C++ strings";
    std::cout << language.size() << '\n';
}
11

std::string を使用するには <string> を、この例の結果を std::cout に書き込む場合は <iostream> をインクルードします。

範囲ベースの for ループで std::string の要素を数える

範囲ベースの for ループは、文字列内の各要素を数えることができます。これは、反復処理の仕組みを学ぶ場合や、各要素にも処理が必要な場合に便利です。通常の長さの問い合わせについては、length() と size() が意図を直接表します。

#include <cstddef>
#include <iostream>
#include <string>

std::size_t countElements(const std::string& value) {
    std::size_t count = 0;
    for (char element : value) {
        ++count;
    }
    return count;
}

int main() {
    const std::string value = "count me";
    std::cout << countElements(value) << '\n';
}
8

このループは、埋め込みのヌル要素を含む、格納されたすべての char 要素を訪問します。std::size_t は、コンテナのサイズやインデックスに使われる標準の符号なし型です。

while ループでヌル終端文字列を数える

手作業の while ループは、ヌル終端の文字シーケンス(しばしば C 文字列と呼ばれます)に適用されます。ループは、終端のヌル文字に到達するまで進みます。そのポインタは、ターミネータを含む有効なシーケンスを指していなければなりません。その保証のない任意のポインタは、この方法では安全に走査できません。

#include <cstddef>
#include <iostream>
#include <string>

std::size_t countUntilNull(const char* text) {
    std::size_t count = 0;
    while (text[count] != '\0') {
        ++count;
    }
    return count;
}

int main() {
    const std::string value = "C++ strings";
    std::cout << countUntilNull(value.c_str()) << '\n';
}
11

c_str() は、文字列のヌル終端表現へのポインタを提供します。ループは最初のヌル文字より前の部分だけを数えるため、std::string に埋め込みのヌルが含まれている場合、格納された完全な長さとは異なることがあります。

ヌル終端文字列で std::strlen を使用する

C ライブラリ関数 std::strlen は、入力がすでに有効なヌル終端バイト文字列である場合のもう 1 つの選択肢です。その宣言には <cstring> をインクルードします。これは最初のヌル文字より前のバイトを数えるため、埋め込みのヌル要素を含む可能性のある std::string の格納された完全な長さが必要な場合に、length() の代わりにはなりません。

#include <cstring>
#include <iostream>
#include <string>

int main() {
    const std::string value = "C++ strings";
    std::cout << std::strlen(value.c_str()) << '\n';
}
11

std::string の c_str() の結果はヌル終端されています。単独の const char* については、std::strlen はそのポインタが有効なヌル終端シーケンスを指していることを要求します。そうでない場合、その走査は利用可能なストレージを超えて読み取る可能性があります。

適切な文字列長メソッドを選ぶ

std::string については、length() または size() を使用して、格納されている char 要素の数を取得します。両者は等価であり、<string> が文字列型を宣言します。数えながら要素を教えたり処理したりする場合は、範囲ベースのループを使用します。

C 文字列については、入力が有効でヌル終端されている場合は std::strlen を使用するか、走査を説明するために while ループを使用します。どちらも最初のヌル文字で止まります。std::string のメソッドは、埋め込みのヌルを含む格納された要素を数えます。これらの数のどれも、Unicode 文字の一般的な数と混同すべきではありません。