文字型

[C++] char*文字列を置換する方法(replace/regex_replace)

C++でchar*文字列を置換するには、標準ライブラリのstd::stringを活用するのが一般的です。

まずchar*std::stringに変換し、std::string::replacestd::regex_replaceを使用して置換を行います。

その後、必要に応じてstd::stringを再びchar*に変換します。

std::string::replaceは部分文字列を直接置換し、std::regex_replaceは正規表現を用いた高度な置換が可能です。

std::string::replaceを使った置換方法

C++の標準ライブラリであるstd::stringクラスには、文字列の一部を置換するためのreplaceメソッドがあります。

このメソッドを使用することで、特定の位置から指定した長さの文字列を新しい文字列に置き換えることができます。

以下にその使い方を示します。

#include <iostream>
#include <string>
int main() {
    std::string originalString = "Hello, World!";
    std::string newString = "C++ Programming";
    // 置換を行う
    originalString.replace(7, 6,
                           newString); // 7文字目から6文字を新しい文字列に置換
    std::cout << originalString << std::endl; // 結果を出力
    return 0;
}
Hello, C++ Programming

このコードでは、元の文字列「こんにちは、世界!」の「世界」を「C++プログラミング」に置換しています。

replaceメソッドの第一引数は置換を開始する位置、第二引数は置換する文字数、第三引数は新しい文字列です。

これにより、簡単に文字列の一部を変更することができます。

std::regex_replaceを使った正規表現による置換

C++11以降、標準ライブラリに追加された<regex>ヘッダを使用することで、正規表現を用いた文字列の置換が可能になります。

std::regex_replace関数を使うことで、特定のパターンにマッチする部分を新しい文字列に置き換えることができます。

以下にその使い方を示します。

#include <iostream>
#include <string>
#include <regex>
int main() {
    std::string originalString = "今日は晴れです。明日も晴れでしょう。";
    std::string pattern = "晴れ"; // 置換対象のパターン
    std::string replacement = "曇り"; // 置換後の文字列
    // 正規表現を使って置換を行う
    std::string resultString = std::regex_replace(originalString, std::regex(pattern), replacement);
    std::cout << resultString << std::endl; // 結果を出力
    return 0;
}
今日は曇りです。明日も曇りでしょう。

このコードでは、元の文字列「今日は晴れです。明日も晴れでしょう。」の「晴れ」を「曇り」に置換しています。

std::regex_replace関数は、第一引数に元の文字列、第二引数に正規表現パターン、第三引数に置換後の文字列を指定します。

これにより、より柔軟な文字列の置換が可能になります。

char*文字列を直接操作して置換する方法

C++では、char*型を使用して文字列を直接操作することも可能です。

この方法では、ポインタを使って文字列の特定の位置にアクセスし、必要に応じて文字を置換することができます。

ただし、char*はメモリ管理が必要であり、バッファオーバーフローに注意が必要です。

以下にその方法を示します。

#include <iostream>
#include <cstring> // strlen, strcpy, strcat
void replaceChar(char* str, const char* target, const char* replacement) {
    char buffer[256]; // 置換後の文字列を格納するバッファ
    char* pos = strstr(str, target); // 置換対象の位置を検索
    if (pos != nullptr) {
        // 置換対象の前の部分をコピー
        strncpy(buffer, str, pos - str);
        buffer[pos - str] = '\0'; // 終端文字を追加
        // 置換後の文字列を追加
        strcat(buffer, replacement);
        // 置換対象の後の部分を追加
        strcat(buffer, pos + strlen(target));
        // 元の文字列を更新
        strcpy(str, buffer);
    }
}
int main() {
    char str[256] = "今日は晴れです。明日も晴れでしょう。";
    const char* target = "晴れ"; // 置換対象
    const char* replacement = "曇り"; // 置換後の文字列
    replaceChar(str, target, replacement); // 置換を実行
    std::cout << str << std::endl; // 結果を出力
    return 0;
}
今日は曇りです。明日も曇りでしょう。

このコードでは、char*型の文字列「今日は晴れです。明日も晴れでしょう。」の「晴れ」を「曇り」に置換しています。

replaceChar関数では、strstrを使って置換対象の位置を検索し、strncpystrcatを使って新しい文字列を構築しています。

char*を直接操作する際は、メモリの管理に注意が必要です。

実践例:char*文字列の置換を行うコード

ここでは、char*型の文字列を使用して、特定の文字列を別の文字列に置換する実践的な例を示します。

この例では、文字列の中に含まれるすべての「晴れ」を「曇り」に置換します。

char*を直接操作する方法を用いて、メモリ管理に注意しながら実装します。

#include <cstring> // strlen, strcpy, strcat
#include <iostream>

void replaceAllChars(char* str, const char* target, const char* replacement) {
    char buffer[512]; // 置換後の文字列を格納するバッファ(サイズを大きくする)
    char* pos;        // 置換対象の位置を指すポインタ
    int targetLen = strlen(target);           // 置換対象の長さ
    int replacementLen = strlen(replacement); // 置換後の長さ

    // 初期化
    buffer[0] = '\0'; // バッファを空にする

    // 文字列の最初から検索
    char* currentPos = str; // 現在の位置を保持するポインタ
    while ((pos = strstr(currentPos, target)) != nullptr) {
        // 置換対象の前の部分をコピー
        strncat(buffer, currentPos, pos - currentPos);
        // 置換後の文字列を追加
        strcat(buffer, replacement);
        // 検索位置を更新
        currentPos = pos + targetLen;
    }
    // 残りの部分を追加
    strcat(buffer, currentPos);

    // バッファのサイズを超えないようにする
    if (strlen(buffer) < 256) {
        // 元の文字列を更新
        strcpy(str, buffer);
    } else {
        std::cerr << "Error: Buffer overflow detected." << std::endl;
    }
}

int main() {
    char str[256] = "今日は晴れです。明日も晴れでしょう。晴れはいい天気です。";
    const char* target = "晴れ";               // 置換対象
    const char* replacement = "曇り";          // 置換後の文字列
    replaceAllChars(str, target, replacement); // 置換を実行
    std::cout << str << std::endl;             // 結果を出力
    return 0;
}
今日は曇りです。明日も曇りでしょう。曇りはいい天気です。

このコードでは、replaceAllChars関数を使用して、文字列内のすべての「晴れ」を「曇り」に置換しています。

strstrを使って置換対象の位置を検索し、strncatstrcatを使って新しい文字列を構築しています。

最終的に、元の文字列を更新して結果を出力します。

この方法は、char*を直接操作する際の基本的なテクニックを示しています。

まとめ

この記事では、C++における文字列の置換方法について、std::string::replacestd::regex_replace、およびchar*を直接操作する方法を詳しく解説しました。

これらの手法を使うことで、さまざまな状況に応じた文字列の置換が可能になります。

文字列操作のスキルを向上させるために、実際にコードを試してみることをお勧めします。

関連記事

Back to top button