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

C++で文字列から禁止文字を削除する関数の実装方法

文字列から「:」「?」「\」「/」「<」「>」「|」「*」といった禁止文字(ファイル名などに使用できない記号)を取り除く関数の作り方について解説します。例えば、次のようなケースが考えられます。

入力: str = "Hello: Welco*me/ to Tu>torials point|."
出力: "Hello Welcome to Tutorials point."
説明: 入力文字列に含まれていた禁止文字がすべて削除され、新しい文字列には禁止文字が残っていません。

入力: str = "How/ are y*ou doing?"
出力: "How are you doing"

解決策へのアプローチ

この問題に対して適用できるシンプルなアプローチは以下の通りです。

  • 文字列を先頭から順に走査します。
  • 各文字が禁止文字に該当するかどうかを1つずつ判定します。
  • 禁止文字に該当する場合は、その文字を削除します。
  • 結果の文字列は、null文字を挿入する方法か、禁止文字以外の文字だけを新しい文字列に格納する方法で生成できます。

実装例

上記のアプローチを実装したC++コード

#include <iostream>
#include <cstring>
using namespace std;

// 禁止文字を削除する関数
void removeForbidden(char* str) {
    int j = 0;
    int n = strlen(str);
    // 文字列を走査しながら禁止文字を探す
    for (int i = 0; i < n; i++) {
        switch (str[i]) {
            case '/':
            case '\\':
            case ':':
            case '?':
            case '"':
            case '<':
            case '>':
            case '|':
            case '*':
                // 禁止文字はコピーせずスキップする
                break;
            default:
                str[j++] = str[i];
        }
    }
    str[j] = '\0'; // 新しい文字列の終端を設定
}

int main() {
    char str[] = "Hello: Welco*me/ to Tu>torial?s point|.";
    removeForbidden(str);
    cout << str << endl;
    return 0;
}

出力結果

Hello Welcome to Tutorials point.

コードの解説

  • switch文を使って文字列を走査し、各文字がcaseラベルで指定した禁止文字と一致するかどうかを確認しています。
  • いずれかのcaseに一致した場合はbreak文によってその文字のコピー処理をスキップするため、結果的に文字列からその文字が削除されます。
  • 禁止文字以外の文字は、インデックスjが指す位置へ順番に書き戻されるため、元の配列内で文字列が前詰め(圧縮)されていきます。
  • ループ終了後にstr[j] = '\0'で終端ヌル文字を設定することで、削除後の文字列が正しく文字列として扱えるようになります。

まとめ

本記事では、「:」「?」「\」「/」「<」「>」「|」「*」といった禁止文字を文字列から削除する関数の作成方法について解説しました。文字列を走査しながら各文字を禁止文字リストと照合していく、シンプルで分かりやすいアプローチを紹介しています。

また、この問題をC++で実装したサンプルプログラムも提示しました。同じロジックはC、Java、Pythonなど他のプログラミング言語でもほぼ同様の形で実装できます。本チュートリアルが皆さんの学習のお役に立てば幸いです。

  1. C++の複素数に対するacos()関数の使い方を解説

    複素数のacos()関数とはここでは、複素数に対するacos()メソッドについて解説します。C++では、<complex>ヘッダーファイルをインクルードすることで複素数を扱うことができます。このヘッダーには、複素数専用のacos()関数も用意されています。これは、通常のacos()関数(実数用の逆余弦関数)を複素数に対応させたバージョンであり、複素数の逆余弦(アークコサイン)を求めるために使用されます。この関数は、複素数を入力パラメーターとして受け取り、その逆余弦を複素数として返します。具体的なイメージをつかむために、以下のサンプルコードを見てみましょう。サンプルコード#inclu

  2. 特定の文字列からN文字のシーケンスを生成するC++プログラム

    この記事では、指定された元の文字列(ベース文字列)をもとに、同じ文字を重複させずに長さNのシーケンス(文字列)を複数個生成するC++プログラムを紹介します。標準ライブラリの rand() 関数でランダムなインデックスを選択することで、実行のたびに異なる組み合わせのシーケンスを作り出せます。 アルゴリズム 開始 関数 GenerateSequence():特定のケースに対してN文字のシーケンスを生成する rand() を使ってランダムなインデックスを生成する 最初の文字はそのままシーケンスに格納する 2文字目以降は、すでに使用済みの文字な