6

下面是从字符串中查找和替换子字符串的代码。但我无法将参数传递给函数。

错误信息 :

从 'const char*' 类型的右值对类型 'std::string& {aka std::basic_string&}' 的非常量引用的无效初始化</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 对象的地址分配给非常量引用,因为这将允许您稍后修改该对象。正确的方法是使用临时变量来传递参数

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

正如@Umer 和@john 所写

于 2013-10-04T05:37:23.797 回答