3

C++ 置換関数に関する小さな質問です。テキスト入力のすべての行を1行ずつ解析しています。テキストファイルの例:

SF27_34KJ
EEE_30888
KPD324222
4230_333

そして、すべての行のアンダースコアをすべて削除し、カンマに置き換える必要があります。私がこのようなことをしようとすると:

mystring.replace(mystring.begin(), mystring.end(), '_', ',');

すべての行で - " SF27,34KJ " の代わりに 95x " , " char を取得します。何が間違っている可能性がありますか?

4

4 に答える 4

6

使用std::replace():

std::replace(mystring.begin(), mystring.end(), '_', ',');
于 2012-06-14T15:44:42.130 に答える
1

basic_string::replaceあなたが思っていることをしません。

basic_string::replace(it_a, it_e, ... )との間のすべての文字を、何かに一致するものだけでなく、指定したものに置き換えます。it_ait_e

やろうとしていることを実行する方法は 100 通りありますが、最も簡単な方法はおそらくstd::replacefrom<algorithm>を使用することです。

std::replace(mystring.begin(), mystring.end(), '_', ',');

もう 1 つの方法は、 functorstd::transformと組み合わせて使用​​することです。これには、1 回のパスで複数の置換を実行できるという利点があります。std::replace

これを行う C++03 ファンクタを次に示します。

struct ReplChars
{
    char operator()(char c) const
    {
        if( c == '_' )
            return ',';
        if( c == '*' )
            return '.';
        return c;
    }
};

...そしてそれの使用:

std::transform(mystring.begin(), mystring.end(), mystring.begin(), ReplChars());

C++11 では、ファンクターの代わりにラムダを使用することでこれを減らすことができます。

std::transform(mystring.begin(), mystring.end(), mystring.begin(), [](char c)->char
{
    if( c == '_' )
        return ',';
    if( c == '*' )
        return '.';
    return c;
});
于 2012-06-14T15:48:01.807 に答える
0

hereを見ると、2 つの反復子と 2 つの文字を使用する replace メソッドはありません。「_」のASCII値が95であることを考えると、代わりにこれを打っていると思います:

string& replace ( iterator i1, iterator i2, size_t n2, char c );

したがって、「_」のすべてのインスタンスを「,」に置き換える代わりに、文字列からbegin()toend()を 95 個の「,」に置き換えます。

文字列内の出現箇所を置き換える方法については、こちらを参照してください。

于 2012-06-14T15:43:32.060 に答える
0

これは正確には置換の仕組みではありません。API http://www.cplusplus.com/reference/string/string/replace/を確認してください。コピーする文字列とともに開始と終了の反復子を指定しますが、他の引数はそのセクションの最大長です.

目的の機能を取得するには、部分文字列を見つけて置換してみてください (2 回の呼び出し)。詳細はこちら: Replace part of a string with another string .

于 2012-06-14T15:44:16.023 に答える