HOWTO · C++

C++ で文字列から最後の文字を取得する方法

この記事では、C++ の文字列から最後の文字を取得する方法について説明します。

このページの内容

"Spider Man" のような文字列では、text.back() がその最後の文字を直接参照します。チェック付きの位置アクセスが必要な場合は、at(text.size() - 1) も使用できます。これらの方法のいずれかを使用する前に、文字列に文字が含まれている必要があります。

std::string::at を使用して C++ の文字列から最後の文字を取得する

std::string::at(index) は、0 から始まる位置にある文字を返し、その位置が文字列の範囲内にあることをチェックします。最後の位置は text.size() - 1 です。インデックスが文字列の範囲外にある場合、at() は std::out_of_range をスローします。インデックスの型は符号なしであるため、負の値は有効な負のインデックスとして機能するのではなく、大きな符号なし値に変換されます。

この例を実行します。

#include <iostream>
#include <string>

int main() {
    const std::string text = "Spider Man";
    std::cout << "Character at position 3: " << text.at(3) << '\n';
    std::cout << "Character at last position: "
              << text.at(text.size() - 1) << '\n';
}

最初のアクセスではインデックス 3 を使用し、2 番目は文字列の長さから最後のインデックスを計算します。その最後の位置を計算して使用する前に、文字列が空でないことを確認してください。

std::string::back() を使用して C++ の文字列から最後の文字を取得する

std::string::back() は、最後の文字にアクセスする直接的な方法です。参照を返すため、その参照を通じて文字を読み取ったり、置換を代入したりできます。空の文字列に対して back() を呼び出すと未定義の動作になるため、使用前に文字列を確認してください。

#include <iostream>
#include <string>

int main() {
    std::string text = "Spider Man";
    const char last = text.back();
    std::cout << "Character at the end: " << last << '\n';
    text.back() = '@';
    std::cout << "After replacement: " << text << '\n';
}

最初の呼び出しでは n を読み取り、代入により文字列は "Spider Ma@" に変わります。

std::string::rbegin() を使用して C++ の文字列から最後の文字を取得する

std::string::rbegin() は、その最初の位置が文字列の最後の文字に対応する逆イテレータを返します。文字列が空でない限り、それを逆参照してその文字を読み取ります。

#include <iostream>
#include <string>

int main() {
    const std::string text = "Spider Man";
    const auto last = *text.rbegin();
    std::cout << "The last character is: " << last << '\n';
}

逆イテレーションを扱う場合は rbegin() を使用します。1 文字だけの場合は、back() の方が直接的です。

文字列イテレータとともに std::reverse を使用して C++ の最後の文字を取得する

std::reverse は <algorithm> で宣言されたアルゴリズムであり、std::string のメンバ関数ではありません。イテレータ範囲内の要素をその場で反転します。空でない文字列を反転した後、text.front() はもともと最後だった文字を参照します。これにより文字列全体が変わるため、最後の文字を読み取るだけの場合は通常不要です。

#include <algorithm>
#include <iostream>
#include <string>

int main() {
    std::string text = "Spider Man";
    std::reverse(text.begin(), text.end());
    std::cout << "The former last character is: " << text.front() << '\n';
}

このアルゴリズムは、begin() から end() までの半開範囲に対して動作します。その後 front() を読む前に、文字列が空でないことを確認してください。

std::string::substr() を使用して C++ の文字列から最後の文字を取得する

std::string::substr(position, count) は新しい文字列を返します。少なくとも 1 文字を含む文字列では、text.substr(text.size() - 1, 1) がその最後の文字を 1 文字の文字列として抽出します。開始位置を計算する前に、文字があることを確認してください。

#include <iostream>
#include <string>

int main() {
    const std::string text = "Spider Man";
    const std::string last = text.substr(text.size() - 1, 1);
    std::cout << "Last character extracted: " << last << '\n';
}

結果が文字列である必要がある場合は substr() を選択します。char で十分な場合は文字アクセス操作を使用します。

配列インデックスを使用して C++ の文字列の文字にアクセスする

std::string は operator[] をサポートしているため、文字列が空でないことを確認した後、最後の文字を text[text.size() - 1] として読み取ることができます。at() とは異なり、operator[] は範囲外の位置に対して同じチェック付きアクセスを提供しません。

#include <iostream>
#include <string>

int main() {
    const std::string text = "Spider Man";
    std::cout << "The last character is: "
              << text[text.size() - 1] << '\n';
}

インデックスは 0 から始まります。長さ n の文字列では、最後の文字はインデックス n - 1 にあります。範囲外のインデックスを例外で報告したい場合は at() を優先してください。

結論

空でない std::string の最後の文字への直接アクセスには、back() を使用します。チェック付きの位置アクセスが役立つ場合は at(size() - 1) を選択します。rbegin() も逆イテレーションを通じて最後の文字に到達し、substr() はそれを文字列として返し、インデックスは at() の境界チェックなしで同じ最後の位置を使用します。末尾にアクセスする前に、文字列に文字が含まれていることを確認してください。