6

以下は、文字列から部分文字列を検索して置換するためのコードです。しかし、関数に引数を渡すことができません。

エラーメッセージ :

タイプ 'const char*' の右辺値からのタイプ 'std::string& {aka std::basic_string&}' の非 const 参照の無効な初期化</p>

説明を手伝ってください

#include <iostream>
#include <string>
using namespace std;

void replaceAll( string &s, const string &search, const string &replace ) {
    for( size_t pos = 0; ; pos += replace.length() ) {
        pos = s.find( search, pos );
        if( pos == string::npos ) break;
        s.erase( pos, search.length() );
        s.insert( pos, replace );
    }
}
int main() {

    replaceAll("hellounny","n","k");
    return 0;
}
4

4 に答える 4

7

簡単に説明すると、replaceAll 関数は文字列を変更しているため、変更する実際の文字列を指定する必要があります。

int main() {
    string str = "hellounny";
    replaceAll(str,"n","k");
    return 0;
}
于 2013-10-04T05:13:54.103 に答える
1

これにより、エラーが削除されます。

#include <iostream>
#include <string>
using namespace std;

void replaceAll( string &s, const string &search, const string &replace ) {
    for( size_t pos = 0; ; pos += replace.length() ) {
        pos = s.find( search, pos );
        if( pos == string::npos ) break;
        s.erase( pos, search.length() );
        s.insert( pos, replace );
    }
}
int main() {

    string temp = "hellounny";
    replaceAll(temp,"n","k");
    return 0;
}
于 2013-10-04T05:14:16.450 に答える
1

一時変数をパラメータとして渡せるようにしたい場合は、代わりに結果を返すことができます:

std::string replaceAll(string s, const string &search, const string &replace ) {
    for( size_t pos = 0; ; pos += replace.length() ) {
        pos = result.find( search, pos );
        if( pos == string::npos ) break;
        result.erase( pos, search.length() );
        s.insert( pos, replace );
    }
    return s;
}

std::string result = replaceAll("hellounny", "n", "k");
于 2013-10-04T05:16:31.253 に答える
0

コードの問題は、非定数参照を使用して一時オブジェクトを参照しようとしていることです。コンパイラは、式の評価用に一時オブジェクトを作成して、オブジェクトの値を一時的に格納します (パラメーターの受け渡し、関数からの値の戻りなど)。非定数オブジェクトのアドレスを const ポインターに割り当てます。これは、変更しても問題ないものを変更しないことを単に約束しているためです。ただし、const オブジェクトのアドレスを非 const 参照に割り当てることはできません。これにより、後でオブジェクトを変更できるようになるためです。正しい方法は、一時変数を使用してパラメーターを渡すことです

int main()
{
    string temp = "This is a Temperory Var";
    replaceAll(temp,"n","k");
}

@Umerと@johnが書いたように

于 2013-10-04T05:37:23.797 に答える