C++ で文字列をトリムする方法
胡金庫
2023年10月12日
この記事では、C++ で文字列をトリミングする方法を説明します。
文字列のトリミング関数を実装するには erase()
、find_first_not_of()
、find_last_not_of()
メソッドを使用する
標準の C++ ライブラリには文字列トリミングのための関数が含まれていないので、自分で実装するか、Boost のような外部ライブラリを利用する必要があります(文字列アルゴリズム参照)。
以下の例では、2つの組み込みの std::string
メソッドを用いてカスタム関数を構築する方法を示します。まず、引数として渡された文字を文字列の左側から切り取る leftTrim
関数を実装します。トリムする文字は .
、,
、/
, 空白を任意に指定しています。
leftTrim
関数は find_first_not_of
メソッドを呼び出して、引数に含まれる char
-s と一致しない最初の文字を探し、その位置を返します。そして erase
メソッドは先頭から見つかった位置までの文字の範囲を削除します。
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
string& leftTrim(string& str, string& chars) {
str.erase(0, str.find_first_not_of(chars));
return str;
}
int main() {
string chars_to_trim = ".,/ ";
string text = ",., C++ Standard";
cout << text << endl;
leftTrim(text, chars_to_trim);
cout << text << endl;
return EXIT_SUCCESS;
}
出力:
,., C++ Standard
C++ Standard
あるいは、trimLeft
関数を元に戻して、文字列の右側から与えられた文字をトリミングすることもできます。この場合は find_last_not_of
メソッドを利用します。これに対応して、erase
メソッドは found position + 1
パラメータを指定して呼び出されます。
これらの関数はどちらもその場で文字列を操作していることに注意してください。
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
string& rightTrim(string& str, string& chars) {
str.erase(str.find_last_not_of(chars) + 1);
return str;
}
int main() {
string chars_to_trim = ".,/ ";
string text = "C++ Standard /././";
cout << text << endl;
rightTrim(text, chars_to_trim);
cout << text << endl;
return EXIT_SUCCESS;
}
出力:
C++ Standard /././
C++ Standard
最後に、前の関数を組み合わせて trimString
関数を実装することができます。この関数は左右のバージョンと同じパラメータを持っています。trimString
は rigthTrim
関数の結果を引数に渡すことで leftTrim
を呼び出します。これらの関数呼び出しの場所を入れ替えても、プログラムの正しさを変えることはありません。
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
string& leftTrim(string& str, string& chars) {
str.erase(0, str.find_first_not_of(chars));
return str;
}
string& rightTrim(string& str, string& chars) {
str.erase(str.find_last_not_of(chars) + 1);
return str;
}
string& trimString(string& str, string& chars) {
return leftTrim(rightTrim(str, chars), chars);
}
int main() {
string chars_to_trim = ".,/ ";
string text = ",,, .. C++ Standard ...";
cout << text << endl;
trimString(text, chars_to_trim);
cout << text << endl;
return EXIT_SUCCESS;
}
,,, .. C++ Standard ...
C++ Standard
著者: 胡金庫