C++ で文字列から句読点を削除する

胡金庫 2023年10月12日
  1. std::erase および std::remove_if 関数を使用して、C++ の文字列から句読点を削除する
  2. C++ でカスタム関数を使用して文字列から句読点を削除する
  3. C++ で反復法を使用して文字列から句読点を削除する
C++ で文字列から句読点を削除する

この記事では、C++ で文字列から句読点を削除する方法のいくつかの方法について説明します。

std::erase および std::remove_if 関数を使用して、C++ の文字列から句読点を削除する

std::remove_if は STL アルゴリズムライブラリの一部であり、指定された条件が true と評価されるすべての要素を削除できます。条件は、範囲内の各要素の bool 値を返す必要があります。この場合、句読記号をチェックするために ispunct 関数を渡します。std::remove_if は、新しい値の範囲の終了パスイテレータを返すため、解析された文字列を生成する erase メソッドを使用して呼び出しをチェーンしていることに注意してください。このソリューションは、erase-remove イディオムと同様に機能します。

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
  string text =
      "Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut "
      "porttitor.";

  cout << text << endl;

  text.erase(std::remove_if(text.begin(), text.end(), ispunct), text.end());
  cout << text << endl;

  return EXIT_SUCCESS;
}

出力:

Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.
Lorem ipsum dolor sit amet consectetur adipiscing elit Ut porttitor

C++ でカスタム関数を使用して文字列から句読点を削除する

または、前のメソッドを別の関数に移動して、指定された文字列のローカルコピーを作成し、解析された値を呼び出し元のコードに返しながら操作することもできます。この関数を使用して、さまざまな文字グループをサポートするように機能を拡張したり、remove_if アルゴリズムの 3 番目のパラメーターにカスタム述語関数を渡したりすることもできます。

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

string removeSpaces(const string& s) {
  string tmp(s);
  tmp.erase(std::remove_if(tmp.begin(), tmp.end(), ispunct), tmp.end());
  return tmp;
}

int main() {
  string text =
      "Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut "
      "porttitor.";

  cout << text << endl;

  string parsed_text = removeSpaces(text);
  cout << parsed_text << endl;

  return EXIT_SUCCESS;
}

出力:

Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.
Lorem ipsum dolor sit amet consectetur adipiscing elit Ut porttitor

C++ で反復法を使用して文字列から句読点を削除する

もう 1つの方法は、文字列のすべての文字を反復処理する個別の関数を実装することです。この関数は参照によって文字列を受け取り、for ループを利用して文字列をトラバースします。各反復で、ispunct が呼び出され、文字が句読記号であるかどうかがチェックされます。元の文字列オブジェクトは erase 関数によって変更され、ループはカウントを更新する必要があるため、len 変数には一致する条件ごとに文字列のサイズが割り当てられることに注意してください。

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

void removeSpaces2(string& s) {
  for (int i = 0, len = s.size(); i < len; i++) {
    if (ispunct(s[i])) {
      s.erase(i--, 1);
      len = s.size();
    }
  }
}

int main() {
  string text =
      "Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut "
      "porttitor.";

  cout << text << endl;

  removeSpaces2(text);
  cout << text << endl;

  return EXIT_SUCCESS;
}

出力:

Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.
Lorem ipsum dolor sit amet consectetur adipiscing elit Ut porttitor
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ String