C++ で文字列から句読点を削除する
胡金庫
2023年10月12日
-
std::erase
およびstd::remove_if
関数を使用して、C++ の文字列から句読点を削除する - 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
著者: 胡金庫