[解決済み] 文字列から先頭と末尾のスペースを削除する
2022-11-23 07:21:42
質問
C++で文字列オブジェクトからスペースを削除する方法。
例えば、以下の文字列オブジェクトから先頭と末尾のスペースを削除する方法です。
//Original string: " This is a sample string "
//Desired string: "This is a sample string"
文字列クラスは、私の知る限りでは、先頭と末尾のスペースを削除するメソッドは提供されていません。
さらに問題なのは、このフォーマットを拡張して、文字列の単語間にある余分なスペースを処理する方法です。たとえば
// Original string: " This is a sample string "
// Desired string: "This is a sample string"
解決策で紹介されている文字列のメソッドを使うと、これらの操作を2段階で行うことが考えられますね。
- 先頭と末尾のスペースを削除する。
- 使用する find_first_of, find_last_of, find_first_not_of, find_last_not_of および substr を使用します。 を使い、単語の境界で繰り返し書式を設定します。
どのように解決するのですか?
これはトリミングと呼ばれるものです。もし ブースト が使えるなら、それをお勧めします。
それ以外の場合は
find_first_not_of
を使って最初の非空白文字のインデックスを取得し、次に
find_last_not_of
でホワイトスペースでない最後からのインデックスを取得します。これらを使って
substr
を使って、周囲の空白文字がない部分文字列を取得します。
あなたの編集に対して、私は用語を知りませんが、"reduce"に沿った何かだと思うので、私はそれをそう呼びました :) (注、柔軟性を持たせるために、white-spaceをパラメータに変更しました)
#include <iostream>
#include <string>
std::string trim(const std::string& str,
const std::string& whitespace = " \t")
{
const auto strBegin = str.find_first_not_of(whitespace);
if (strBegin == std::string::npos)
return ""; // no content
const auto strEnd = str.find_last_not_of(whitespace);
const auto strRange = strEnd - strBegin + 1;
return str.substr(strBegin, strRange);
}
std::string reduce(const std::string& str,
const std::string& fill = " ",
const std::string& whitespace = " \t")
{
// trim first
auto result = trim(str, whitespace);
// replace sub ranges
auto beginSpace = result.find_first_of(whitespace);
while (beginSpace != std::string::npos)
{
const auto endSpace = result.find_first_not_of(whitespace, beginSpace);
const auto range = endSpace - beginSpace;
result.replace(beginSpace, range, fill);
const auto newStart = beginSpace + fill.length();
beginSpace = result.find_first_of(whitespace, newStart);
}
return result;
}
int main(void)
{
const std::string foo = " too much\t \tspace\t\t\t ";
const std::string bar = "one\ntwo";
std::cout << "[" << trim(foo) << "]" << std::endl;
std::cout << "[" << reduce(foo) << "]" << std::endl;
std::cout << "[" << reduce(foo, "-") << "]" << std::endl;
std::cout << "[" << trim(bar) << "]" << std::endl;
}
結果
[too much space]
[too much space]
[too-much-space]
[one
two]
関連
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] どうすれば、文字列中のリテラルな中抜き文字を印刷し、また.formatを使用することができるのでしょうか?
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
-
[解決済み] 文字列から空白を取り除くには?
-
[解決済み] テキストファイルを文字列変数に読み込んで、改行を除去するには?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】大文字と数字を含むランダムな文字列の生成
-
[解決済み】Javaの文字列から先頭と末尾の空白を取り除く
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み] c++の文字列の中のcharの出現をすべて削除する方法