質問

ここでは、文字列のシーケンスを見つけ、別のと交換のための私のコードです:

std::string find_and_replace( string &source, string find, string replace )
{
    size_t j;
    for ( ; (j = source.find( find )) != string::npos ; )
    {
        source.replace( j, find.length(), replace );
    }
    return source;
}

私はのようなものを呼び出すときにすべてが正常に動作します:

find_and_replace(test, "foo", "bar")

私のアプリケーションは、2つの単一引用符と単一引用符ではなく二重引用符を置き換えるために私を必要とします。例えば、私が呼び出します。

find_and_replace(test, "'", "''")

しかし、私はこれを呼び出すたび、機能が何らかの理由でフリーズ。誰もがこの問題の原因である可能性があります何を知っていますか?

編集:私が得ている回答に基づいて、私は、コードを固定しています:

std::string find_and_replace( string &source, string find, string replace )
{
    string::size_type pos = 0;
    while ( (pos = source.find(find, pos)) != string::npos ) {
        source.replace( pos, find.size(), replace );
        pos += replace.size();
    }
    return source;
}

私は、これは一部の人が同じ問題を抱えて助けを願っています。

役に立ちましたか?

解決

あなたの状態が前進しないので、

あなたは無限ループを持っています。あなたはいつもj = source.find( find )を実行している、しかし、あなたは'''を交換しているので、あなたは常に最初にアポストロフィを毎回発見し、文字列に新しいアポストロフィを追加しています。

あなたは、あなたが前方にあなたが何かを交換するたびにスキャンしている場所移動することにより、二度同じアポストロフィと一致しないことを確認する必要があります。

find機能はサブ探したい文字列内の開始位置である第二のパラメータを取ります。あなたが最初のマッチの位置を見つけたら、その位置プラスあなたはでそれを交換している文字列の長さまでの開始位置を移動します。

他のヒント

あなたは「『と』を置換するので、あなたはただそこに置かれているものの最初のを見つけ、再び」を検索します。これはあなたが交換してください。そしてそうでます。

あなたが追加したのと同じ文字列を置換しようとしています。

これは、右から左に働くことはおそらく良いでしょう。これは私のために動作します:

const std::string& replacestring( std::string& strString, const std::string& strOld, const std::string& strNew )
{
    for ( int nReplace = strString.rfind( strOld ); nReplace != std::string::npos; nReplace = strString.rfind( strOld, nReplace - 1 ) )
    {
        strString.replace( nReplace, strOld.length(), strNew );
        if ( nReplace == 0 )
            break;
    }
    return strString;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top