C++のsubstr関数を使いこなす7つの方法

C++でのsubstr関数絵を解説するイメージC++
この記事は約15分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

C++のプログラミングを学ぶ上で、文字列処理は非常に重要な要素です。

特に、substr関数は文字列を扱う上で頻繁に用いられる機能の一つであり、この関数を理解し使いこなすことは、C++のプログラミングスキルを向上させるために欠かせません。

本記事では、C++のsubstr関数について、その基本から応用までを詳細に解説します。

初心者の方でも理解しやすいように、具体的なコード例を交えながら、この関数の使い方を段階的に学んでいきましょう。

●C++のsubstr関数とは

C++におけるsubstr関数は、文字列から特定の部分文字列を切り出すために使用されます。

この関数は、特に文字列データを処理する際に非常に便利で、プログラミングにおける様々なシナリオで利用されます。

例えば、ユーザー入力から特定の情報を抽出する場合や、ファイル名から拡張子を取得する場合など、多岐にわたる用途があります。

○substr関数の基本

substr関数は、基本的には2つのパラメータを取ります。

1つ目のパラメータは切り出す部分文字列の開始位置を示し、2つ目のパラメータは切り出す文字数です。

例えば、string s = "HelloWorld"; という文字列があった場合、s.substr(0, 5); とすると “Hello” という文字列が得られます。

ここで、第1パラメータの 0 は文字列の最初の文字(’H’)から開始することを意味し、第2パラメータの 5 は5文字を切り出すことを意味します。

○substr関数の構文

substr関数の構文は比較的シンプルです。

基本的な形式は string.substr(pos, len); です。

ここで、pos は部分文字列の開始位置を指定する整数値、len は切り出す文字数を指定する整数値です。

len パラメータは省略可能で、省略した場合は開始位置から文字列の終わりまでが切り出されます。

また、pos が文字列の長さを超えた場合、C++の標準ライブラリは std::out_of_range 例外を投げることがあります。

したがって、substr関数を使用する際には、常に文字列の長さを考慮する必要があります。

●substr関数の基本的な使い方

C++におけるsubstr関数の基本的な使い方を理解することは、プログラミングにおいて非常に重要です。

この関数は、文字列から必要な部分だけを切り出す際に使われます。

これにより、データの解析や処理、ユーザー入力の処理など、さまざまな場面で活用することが可能です。

ここでは、substr関数の基本的な使い方をいくつかのサンプルコードを通じて見ていきます。

○サンプルコード1:基本的な文字列切り出し

最も基本的なsubstr関数の使用例として、ある文字列から部分文字列を切り出す方法を見ていきましょう。

たとえば、文字列 “Hello, World!” から “Hello” を切り出す場合、下記のようにコードを記述します。

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    std::string sub = str.substr(0, 5); // 0番目から5文字切り出す
    std::cout << sub << std::endl; // "Hello" が出力される
    return 0;
}

この例では、substr関数に 0 (開始位置)と 5 (長さ)を指定しています。

これにより、文字列 “Hello, World!” の最初の5文字 “Hello” が切り出されます。

○サンプルコード2:特定の位置から文字列を切り出す

次に、文字列の途中から部分文字列を切り出す方法を見てみましょう。

例えば、”Hello, World!” の “, World!” 部分を切り出すには、下記のように記述します。

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    std::string sub = str.substr(5); // 5番目から最後まで切り出す
    std::cout << sub << std::endl; // ", World!" が出力される
    return 0;
}

ここでは、substr関数の第1引数に 5 を指定しています。第2引数を省略すると、指定した位置から文字列の終わりまでが切り出されます。

○サンプルコード3:文字列の終わりまで切り出す方法

最後に、文字列の一部分を最後まで切り出す方法について説明します。

先ほどの例と似ていますが、ここでは文字列の途中から最後までを切り出すことに焦点を当てています。

例えば、”Hello, World!” の “World!” 部分を切り出すには、下記のようにします。

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    std::string sub = str.substr(7); // 7番目から最後まで切り出す
    std::cout << sub << std::endl; // "World!" が出力される
    return 0;
}

この例では、substr関数に 7 を指定しており、7番目の文字(この場合は ‘W’)から始まる部分文字列が切り出されます。

●substr関数の応用例

C++のsubstr関数は、基本的な文字列操作を超えて、多岐にわたる応用が可能です。

データ処理や検索、さらには複雑な文字列の操作に至るまで、substr関数は強力なツールとなります。

ここでは、そのような応用例をいくつかのサンプルコードを通じてご紹介します。

○サンプルコード4:部分文字列を用いた検索

文字列内で特定のパターンを探す場合、substr関数は非常に便利です。

例えば、長い文字列の中から特定の単語を見つけ出す際に活用できます。

#include <iostream>
#include <string>

int main() {
    std::string str = "今日は晴れですが、明日は雨かもしれません。";
    std::string keyword = "晴れ";
    size_t pos = str.find(keyword);
    if (pos != std::string::npos) {
        std::cout << "キーワードが見つかりました: " << str.substr(pos, keyword.length()) << std::endl;
    } else {
        std::cout << "キーワードは見つかりませんでした。" << std::endl;
    }
    return 0;
}

このコードでは、find関数を使用してキーワードの位置を探し、その位置からキーワードの長さだけsubstr関数で切り出しています。

○サンプルコード5:動的な文字列処理

substr関数は動的な文字列処理にも役立ちます。

例えば、ユーザー入力やデータファイルから読み取った内容に基づいて、文字列の特定部分を操作する場合に使用できます。

#include <iostream>
#include <string>

int main() {
    std::string str = "名前: 山田, 年齢: 30, 職業: エンジニア";
    size_t pos1 = str.find("名前: ");
    size_t pos2 = str.find(", 年齢: ");
    if (pos1 != std::string::npos && pos2 != std::string::npos) {
        std::string name = str.substr(pos1 + 4, pos2 - (pos1 + 4));
        std::cout << "名前: " << name << std::endl;
    }
    return 0;
}

この例では、文字列から「名前」というラベルに続く部分を切り出しています。

○サンプルコード6:複数のsubstrを組み合わせた使用例

複数のsubstr関数を組み合わせることで、より複雑な文字列操作を行うことができます。

例えば、文字列から特定のフォーマットに基づいて情報を抽出する場合などです。

#include <iostream>
#include <string>

int main() {
    std::string str = "商品A:100円, 商品B:200円, 商品C:300円";
    size_t pos = 0;
    while ((pos = str.find(':', pos)) != std::string::npos) {
        size_t end = str.find(',', pos);
        std::string item = str.substr(pos - 2, 3);
        std::string price = str.substr(pos + 1, end - (pos + 1));
        std::cout << item << "の価格は" << price << "円です。" << std::endl;
        pos = end + 2;
    }
    return 0;
}

このコードでは、商品と価格のペアを文字列から抽出しています。

○サンプルコード7:substrを使ったデータ解析

substr関数を使ったデータ解析の例を見てみましょう。

たとえば、ログファイルから特定の情報を切り出す場合などに有効です。

#include <iostream>
#include <string>
#include <vector>

int main() {
    std::vector<std::string> logs = {"[ERROR] 2024-02-18 10:00: システムエラー発生", "[INFO] 2024-02-18 10:30: 正常動作確認"};
    for (const auto& log : logs) {
        size_t pos = log.find("] ");
        std::string level = log.substr(1, pos - 1);
        std::string message = log.substr(pos + 2);
        std::cout << "ログレベル: " << level << ", メッセージ: " << message << std::endl;
    }
    return 0;
}

このコードでは、ログのレベルとメッセージを切り分けて表示しています。

substr関数は、このように文字列を解析し、必要な情報を抽出するのに役立ちます。

●substr関数の注意点と対処法

C++のsubstr関数を使用する際には、いくつかの注意点があります。

これらの注意点を理解し、適切な対処法を取ることで、エラーを避け、効率的なプログラミングが可能となります。

ここでは、特に重要な注意点とその対処法について詳しく解説します。

○文字列範囲の誤りとその対処

substr関数を使用する際に最も注意すべき点は、文字列の範囲を誤って指定することです。

範囲を誤ると、std::out_of_range例外が発生することがあります。

これを避けるためには、常に文字列の長さを確認し、範囲が文字列の長さを超えないようにすることが重要です。

例えば、下記のコードでは範囲の誤りを避けるために、substr関数を呼び出す前に文字列の長さを確認しています。

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    if (str.length() > 10) {
        std::string sub = str.substr(10, 5); // 10番目から5文字切り出す
        std::cout << sub << std::endl;
    } else {
        std::cout << "指定された範囲は文字列の長さを超えています。" << std::endl;
    }
    return 0;
}

このコードでは、substr関数を呼び出す前にstr.length()を使用して文字列の長さを確認し、範囲が文字列の長さを超えていないことを保証しています。

○メモリ使用の最適化

substr関数は新しい文字列オブジェクトを生成するため、大量の文字列操作を行う場合にはメモリ使用量に注意が必要です。

特に大規模なデータを扱うアプリケーションや、高頻度でsubstr関数を呼び出す場合には、メモリ使用の最適化を検討することが推奨されます。

メモリ使用を最適化する一つの方法は、必要な部分文字列だけを生成し、それ以外の部分は無視することです。

また、可能であればsubstr関数の代わりにポインタやイテレータを使用して直接文字列の一部を参照する方法も効果的です。

例えば、下記のコードでは、大きな文字列から小さな部分文字列を生成する代わりに、イテレータを使用して必要な部分を直接参照しています。

#include <iostream>
#include <string>

int main() {
    std::string str = "非常に長い文字列がここにあります。ここから必要な部分だけを抽出します。";
    auto start = str.begin() + 10; // 開始位置のイテレータ
    auto end = start + 5; // 終了位置のイテレータ
    std::string sub(start, end); // イテレータを使用して部分文字列を生成
    std::cout << sub << std::endl;
    return 0;
}

このコードでは、substr関数を使う代わりに、イテレータを使用して必要な部分文字列を効率的に生成しています。

これにより、大きな文字列全体をコピーすることなく、必要な部分だけを扱うことができ、メモリ使用の最適化に貢献します。

●substr関数のカスタマイズ方法

C++におけるsubstr関数は非常に強力で柔軟ですが、特定のニーズに応じてさらにカスタマイズすることが可能です。

ここでは、substr関数のカスタマイズ方法に焦点を当て、より特化した用途に合わせた関数の作成方法について説明します。

○カスタム関数を作成する

特定のパターンやルールに基づいて文字列を切り出す必要がある場合、独自のカスタム関数を作成することが有効です。

例えば、特定のフォーマットに従った日付や時間を文字列から抽出する専用の関数を作成することができます。

下記の例では、日付の文字列から年、月、日を切り出すカスタム関数を定義しています。

#include <iostream>
#include <string>

std::string extractDate(const std::string& str) {
    size_t pos1 = str.find("-");
    size_t pos2 = str.find("-", pos1 + 1);
    if (pos1 != std::string::npos && pos2 != std::string::npos) {
        return str.substr(pos1 + 1, pos2 - pos1 - 1);
    }
    return "";
}

int main() {
    std::string dateStr = "2024-02-18";
    std::string month = extractDate(dateStr);
    std::cout << "月: " << month << std::endl; // "02"が出力される
    return 0;
}

この関数extractDateは、-で区切られた年月日のフォーマットから月を抽出します。

○substr関数の拡張利用

substr関数を拡張して、複数の条件に基づいて文字列を処理する関数を作成することも可能です。

例えば、ある特定のキーワードが見つかった場合のみ部分文字列を切り出す関数などが考えられます。

ここでは、特定のキーワードが含まれる場合にのみ、そのキーワードに続く文字列を切り出す関数の例を紹介します。

#include <iostream>
#include <string>

std::string extractFollowingText(const std::string& str, const std::string& keyword) {
    size_t pos = str.find(keyword);
    if (pos != std::string::npos) {
        return str.substr(pos + keyword.length());
    }
    return "";
}

int main() {
    std::string str = "重要なお知らせ: 明日のイベントは中止になりました。";
    std::string result = extractFollowingText(str, "重要なお知らせ: ");
    std::cout << result << std::endl; // "明日のイベントは中止になりました。"が出力される
    return 0;
}

この関数は、文字列strの中でkeywordが見つかった場合に、そのキーワードの直後に続く部分文字列を切り出します。

まとめ

この記事では、C++のsubstr関数の基本的な使い方から、応用例、注意点、そしてカスタマイズ方法に至るまでを詳しく解説しました。

これらの知識を活用することで、C++における文字列処理のスキルを大幅に向上させることができます。

substr関数は、その柔軟性と強力な機能により、プログラミングにおける多様なシナリオで役立つツールです。

この関数の理解と適切な利用を通じて、C++における効率的かつ効果的なプログラミングを実現しましょう。