C++ Stringsにおけるstd::basic_string::substr

2024-04-02

C++のStringsにおけるstd::basic_string::substr

使い方

std::basic_string::substrは以下の形式で呼び出されます。

std::basic_string::substr(pos, len);
  • pos: 部分文字列の開始位置を指定する整数値です。
  • len: 部分文字列の長さを指定する整数値です。

std::string str = "Hello, world!";

// "world!"を取得
std::string substr = str.substr(7, 6);

std::cout << substr << std::endl; // "world!"

上記の例では、strの7番目から6文字分の部分文字列を取得し、substr変数に格納しています。

詳細

  • posは、文字列の先頭からのオフセットを表します。0から始まることに注意してください。
  • lenは、取得する部分文字列の長さを表します。std::string::nposを指定すると、文字列の末尾まで取得できます。
  • posまたはlenが負の値の場合、std::out_of_range例外が送出されます。
  • posが文字列の長さよりも大きい場合、空の文字列が返されます。

std::basic_string::substrには、以下のような便利なオーバーロードも存在します。

  • std::basic_string::substr(pos): lenを省略すると、posから文字列の末尾までを取得します。
  • std::basic_string::substr(it): イテレータを指定して、その位置から文字列の末尾までを取得できます。

std::basic_string::substrは、C++のStringsから部分文字列を取得するための強力なツールです。使い方をマスターすれば、文字列操作を効率的に行うことができます。



std::basic_string::substr のサンプルコード

文字列の特定の部分を取得する

std::string str = "Hello, world!";

// "world!"を取得
std::string substr = str.substr(7, 6);

std::cout << substr << std::endl; // "world!"

文字列の先頭から特定の長さの部分を取得する

std::string str = "Hello, world!";

// 最初の5文字を取得
std::string substr = str.substr(0, 5);

std::cout << substr << std::endl; // "Hello"

文字列の末尾から特定の長さの部分を取得する

std::string str = "Hello, world!";

// 最後の5文字を取得
std::string substr = str.substr(str.length() - 5, 5);

std::cout << substr << std::endl; // "world!"

イテレータを使って部分文字列を取得する

std::string str = "Hello, world!";

// "world!" をイテレータを使って取得
std::string substr(str.begin() + 7, str.begin() + 13);

std::cout << substr << std::endl; // "world!"

部分文字列を検索して取得する

std::string str = "Hello, world!";

// "world" を検索して取得
size_t pos = str.find("world");
if (pos != std::string::npos) {
  std::string substr = str.substr(pos);
  std::cout << substr << std::endl; // "world!"
}

部分文字列を置き換える

std::string str = "Hello, world!";

// "world" を "Universe!" に置き換える
str.replace(7, 6, "Universe!");

std::cout << str << std::endl; // "Hello, Universe!"

部分文字列を削除する

std::string str = "Hello, world!";

// "world" を削除
str.erase(7, 6);

std::cout << str << std::endl; // "Hello, "


std::basic_string::substr 以外の部分文字列を取得する方法

for ループ

std::string str = "Hello, world!";

// "world!" を取得
std::string substr;
for (size_t i = 7; i < str.length(); ++i) {
  substr += str[i];
}

std::cout << substr << std::endl; // "world!"

while ループ

std::string str = "Hello, world!";

// "world!" を取得
std::string substr;
size_t i = 7;
while (i < str.length()) {
  substr += str[i];
  ++i;
}

std::cout << substr << std::endl; // "world!"

find() と substr()

std::string str = "Hello, world!";

// "world" を検索して取得
size_t pos = str.find("world");
if (pos != std::string::npos) {
  std::string substr = str.substr(pos);
  std::cout << substr << std::endl; // "world!"
}

find_if() と substr()

std::string str = "Hello, world!";

// "world" を検索して取得
auto is_space = [](char c) { return c == ' '; };
size_t pos = str.find_if(is_space, str.begin() + 7);
if (pos != std::string::npos) {
  std::string substr = str.substr(pos);
  std::cout << substr << std::endl; // "world!"
}

find_end() と substr()

std::string str = "Hello, world!";

// "world" を検索して取得
auto is_space = [](char c) { return c == ' '; };
size_t pos = str.find_end_if(is_space, str.rbegin());
if (pos != std::string::npos) {
  std::string substr = str.substr(pos);
  std::cout << substr << std::endl; // "world!"
}

補足

上記以外にも、C++ 17 以降では std::string_view クラスを使用する方法もあります。

std::string str = "Hello, world!";

// "world!" を取得
std::string_view substr(str.data() + 7, 6);

std::cout << substr << std::endl; // "world!"

std::string_view は、std::string よりも軽量なクラスであり、部分文字列を取得するような場合に有効です。




C++で文字コード変換をマスターしよう!std::btowcの使い方とサンプルコード

この関数を使うことで、異なるエンコード間で文字列を効率的に変換したり、マルチバイト文字を扱うプログラムを作成することができます。std::btowcは以下の形式で定義されています。c: 変換する単一バイト文字std::wint_t: 変換結果のワイド文字



質問:C++で「std::basic_string_view::size」関数を用いて文字列の長さを取得する方法

概要std::basic_string_view::size 関数は、std::basic_string_view オブジェクトが保持する文字列の長さを取得します。これは、文字列の要素数に相当します。戻り値この関数は、保持している文字列の長さを size_type 型で返します。size_type 型は、文字列の長さを表現するために使用される符号なし整数型です。


C++でハッシュ値を生成: std::u16string_viewとstd::hash

この解説では、以下の内容について説明します。std::hash テンプレートクラスstd::u16string_view 型std::hash<std::u16string_view> の使用方法応用例std::hash テンプレートクラスは、コンテナ内の要素をハッシュ化するために使用されます。ハッシュ化とは、データを数値に変換する処理です。ハッシュ値は、オブジェクトを一意に識別するために使用できる数値です。


std::wstring_convertクラス:std::wcsrtombs関数のより安全な代替手段

std::wcsrtombs は、ワイド文字列をマルチバイト文字列に変換する関数です。これは、異なる文字エンコーディングを使用するシステム間で文字列データを交換する必要がある場合に役立ちます。機能std::wcsrtombs は以下の機能を提供します。


C++ Strings の魔法使い:std::stoi で文字列を整数に変換する

この解説では、std::stoi の使い方を分かりやすく説明し、さらにその仕組みや注意点についても詳しく掘り下げていきます。std::stoi は、string 型の文字列を受け取り、それを int 型の整数に変換する関数です。使い方はとても簡単で、以下のコードのように記述します。



C++ プログラマー必見: 推論ガイドによる std::basic_string の使いこなし

C++20 では、std::basic_string クラスのための推論ガイドが導入されました。これは、コンパイラがテンプレート引数を自動的に推論し、コードをより簡潔に記述できる機能です。推論ガイドとは?推論ガイドは、テンプレート引数を明示的に指定しなくても、コンパイラがテンプレート引数を自動的に推論できる仕組みです。これは、コードの冗長性を減らし、可読性を向上させるのに役立ちます。


C++ Null 終端マルチバイト文字列:基礎から応用まで

概要文字列は連続したバイトの列で表される。各バイトは 1 文字を表す。文字列の最後のバイトはヌル文字('\0')で終端される。ヌル文字は文字列の終わりを示す。マルチバイト文字列は、1 バイト以上のバイトで構成される文字を表すことができる。例


C++ Strings: std::basic_string::assign_range 関数徹底解説

std::basic_string::assign_range は、C++ 標準ライブラリ std::string クラスのメンバー関数で、指定された範囲の要素を使って文字列の内容を置き換えます。これは、文字列を効率的に初期化または変更したい場合に便利な関数です。


C++の「std::wcstoimax」でワイド文字列を整数に変換:詳細解説とサンプルコード

概要std::wcstoimax は、C++ の標準ライブラリに含まれる関数で、ワイド文字列 (wstring) を指定した基数に基づいて整数値に変換します。これは、std::stoi() 関数のワイド文字列バージョンと考えることができます。


std::basic_string::end メソッドを使いこなして、C++ Strings を制覇しよう!

std::basic_string::end メソッドは、C++ の標準ライブラリ std::string クラスで使用される関数で、文字列の終端位置を示すイテレータを返します。このイテレータは、文字列の最後の文字の後に位置する仮想的な文字を指します。