10

文字列からタブ文字 ( "\t"s ) を取り除く方法を提案できる人はいますか? CString または std::string。

たとえば、「1E10」は「1E10」になります。

4

9 に答える 9

20

文字列内のすべてのオカレンスを削除する場合は、 erase/removeイディオムを使用できます。

#include <algorithm>

s.erase(std::remove(s.begin(), s.end(), '\t'), s.end());

文字列の最初と最後のタブのみを削除する場合は、ブースト文字列アルゴリズムを使用できます。

#include <boost/algorithm/string.hpp>

boost::trim(s); // removes all leading and trailing white spaces
boost::trim_if(s, boost::is_any_of("\t")); // removes only tabs

Boostの使用がオーバーヘッドが大きすぎる場合は、文字列メソッドを使用find_first_not_ofして独自のトリム関数をロールできます。find_last_not_of

std::string::size_type begin = s.find_first_not_of("\t");
std::string::size_type end   = s.find_last_not_of("\t");

std::string trimmed = s.substr(begin, end-begin + 1);
于 2009-02-17T11:06:06.937 に答える
20

hackingwordsの答えはあなたを途中まで連れて行きます。ただしstd::remove()、from<algorithm>は実際には文字列を短くしません。つまり、「新しいシーケンスはここで終了します」というイテレータを返すだけです。あなたはそれをするために電話する必要がありますmy_string().erase()

#include <string>
#include <algorithm>    // For std::remove()

my_str.erase(std::remove(my_str.begin(), my_str.end(), '\t'), my_str.end());
于 2009-02-17T11:10:16.943 に答える
6

アルゴリズムは、削除されないようにすべての文字を最初removeにシフトし、削除された文字を上書きしますが、コンテナーの長さは変更しません(イテレーターで機能し、基になるコンテナーを認識しないため)。これを実現するには、次のように呼び出しますerase

str.erase(remove(str.begin(), str.end(), '\t'), str.end());
于 2009-02-17T11:05:16.767 に答える
3

他の人が std::string でこれを行う方法をすでに回答しているため、CString に使用できるものは次のとおりです。

myString.TrimRight( '\t' ); // trims tabs from end of string
myString.Trim( '\t' ); // trims tabs from beginning and end of string

文字列内のタブを含め、すべてのタブを削除する場合は、次を使用します

myString.Replace( _T("\t"), _T("") );
于 2009-02-17T11:31:43.863 に答える
2

HackingWordsはもうすぐそこにあります:eraseをremoveと組み合わせて使用​​します。

std::string my_string = "this\tis\ta\ttabbed\tstring";
my_string.erase( std::remove( my_string.begin(), my_string.end(), '\t'), my_string.end());
于 2009-02-17T11:11:38.517 に答える
2

文字列をスキャンし、見つかったすべての出現箇所を削除します。

于 2009-02-17T10:49:00.770 に答える
1

CString を置き換えますか?

置換 ('\t', '')

于 2009-02-17T10:55:08.023 に答える
0

なぜ誰もこのように文字列をトリミングしないのだろうか:

void trim (string& s)  {
    string t = "";
    int i = 0;
    while(s[i] == ' ') i++;
    while(s[i] == '\t') i++;
    for(i; i < s.length(); i++)
        t += s[i];

    s = t;
}
于 2015-12-15T06:26:57.717 に答える
0

最初のアイデアはremoveを使用することです

remove(myString.begin(), myString.end(), "\t");

その比較が機能しない場合は、代わりに remove_if を使用する必要があるかもしれませんが。

于 2009-02-17T10:52:21.183 に答える