C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で文字列内の特定の単語をアスタリスク(*)に置き換える方法

このプログラムの目的は、C++のコードを使って文字列内の特定の単語をアスタリスク(*)に置き換えることです。この処理を実現するうえで、vectorクラスとstringクラスの機能が重要な役割を果たします。まずは全体の流れを把握するために、アルゴリズムを確認しましょう。

アルゴリズム

START
    Step-1: 文字列を入力する
    Step-2: 文字列を単語に分割し、配列(vector)に格納する
    Step-3: 置き換え対象の単語の長さ分だけループし、アスタリスクを変数に生成する
    Step-4: 範囲forループで配列を走査し、各単語を置き換え対象の単語と比較する
    Step-5: 結果を出力する
END

続いて、このアルゴリズムに基づいて実装したコードを紹介します。ここでは、string.hstrtok()関数を使って文字列をスペースで分割し、その結果をvector<std::string>型のリストとして返すsplit()関数を定義しています。

サンプルコード

#include <cstring>
#include <iostream>
#include <vector>
#include <string.h>

// 文字列を指定した区切り文字で分割するメソッド
std::vector<std::string> split(std::string str, std::string sep){
    char* cstr = const_cast<char*>(str.c_str());
    char* current;
    std::vector<std::string> arr;
    current = strtok(cstr, sep.c_str());
    while(current != NULL){
        arr.push_back(current);
        current = strtok(NULL, sep.c_str());
    }
    return arr;
}

int main(){
    std::vector<std::string> word_list;
    std::cout << "string before replace::" << "Hello ajay yadav ! you ajay you are star" << std::endl;
    std::cout << "word to be replaced::" << "ajay" << std::endl;

    word_list = split("Hello ajay yadav ! you ajay you are star", " ");

    std::string result = "";
    // 置き換え対象の単語と同じ長さのアスタリスク(検閲用文字列)を作成
    std::string stars = "";
    std::string word = "ajay";
    for (int i = 0; i < word.length(); i++)
        stars += '*';

    // 抽出した単語リストを走査し、一致する単語をアスタリスクに置き換える
    int index = 0;
    for (std::string i : word_list){
        if (i.compare(word) == 0)
            word_list[index] = stars;
        index++;
    }

    // 単語を連結して元の文に戻す
    for (std::string i : word_list){
        result += i + ' ';
    }

    std::cout << "output::" << result;
    return 0;
}

上記のコードでは、文字列の分割から置換、再結合までの一連の処理をsplit()関数とmain()関数に整理しています。処理の流れは以下のとおりです。

  1. split()関数がstrtok()を使って入力文字列をスペースで分割し、単語のリスト(vector)を生成します。
  2. 置き換え対象の単語「ajay」と同じ長さのアスタリスク文字列「****」を事前に作成しておきます。
  3. 範囲forループでリスト内の各単語をcompare()で比較し、一致した単語をアスタリスクに置き換えます。
  4. 最後にすべての単語をスペースで連結し、結果の文字列として出力します。

実行結果

String before replace::Hello ajay yadav ! you ajay you are star
Word to be replaced::ajay
Output::Hello **** yadav ! you **** you are star

このように、文字列内に含まれる指定した単語だけがアスタリスクに置き換えられ、それ以外の単語はそのまま出力されます。掲示板やチャットアプリなどで不適切な語をマスキングするフィルタ処理など、実用的な場面にも応用できるテクニックです。

  1. C++でカンマ区切りのstd::stringを解析して分割する方法

    本記事では、C++でカンマ区切りの文字列(カンマで区切られたstd::string)を解析する方法を解説します。カンマで区切られた複数のテキストを含む文字列を用意し、プログラムを実行すると、それらをvector型のオブジェクトに分割して格納します。文字列の分割には、getline()関数を使用します。この関数の基本的な構文は以下のとおりです。getline (input_stream, string, delim)この関数は、入力ストリームから文字列や1行を読み取るために使われます。第3引数のdelimに区切り文字を指定することで、その文字を境界として文字列を切り出すことができます。入力:文字

  2. C++で1文字を文字列に変換する3つの方法を解説

    C++で1文字(char型)を文字列(std::string)に変換するには、いくつかの方法があります。この記事では、代表的な3つの手法をサンプルコードと実行結果付きでわかりやすく解説します。サンプルコード以下は、C++で単一の文字を文字列に変換するプログラムの例です。3つの異なる方法を1つのコードにまとめています。#include <iostream> #include<string> #include<sstream> int main() {     char c = 'm';  &