用值替换字符串中的特定char

时间:2014-08-06 21:12:27

标签: c++ string replace char

我想替换字符串中的特定字符,我有以下代码来尝试这个,但它不能像我希望的那样工作。它只输出原始字符串。

我做错了什么?

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

void instantiateVariable(string expr, char var_, int val_){
    replace(expr.begin(), expr.end(), 'var_', 'val_');
    cout << expr;
}

int main()
{
    string expr_ =  "x + (3 + 4)";
    instantiateVariable(expr_, 'x', 3);
}

3 个答案:

答案 0 :(得分:3)

删除var_val_周围的单引号:

replace(expr.begin(), expr.end(), var_, val_);

然后,将呼叫更改为:

instantiateVariable(expr_, 'x', '3');

最后,instantiateVariable修改字符串参数的本地副本,而不是参数本身。如果要修改实际参数,请参考expr

void instantiateVariable(string &expr, char var_, int val_)

修改 上面的问题仍然是错误的,因为var_是char而val_是int,你需要匹配的类型来调用std :: replace()。这里的深层问题是,如果我正确理解您的需求,std::replace()不是正确的算法。例如。如果您决定将“x”替换为值15,则不能使用std::replace()执行此操作。如果我要实现这样的话,我会将boost::algorithm::replace_all()boost::lexical_cast结合使用。

答案 1 :(得分:3)

replace适用于元素而非子字符串。因此,您只能使用它来将一个字符替换为另一个字符。但是,您可以使用find算法,并使用返回的迭代器作为string:replace方法的输入。由于var_是整数而不是string,因此还需要先进行转换。我为您准备了一个小示例代码,其中显示了如何使用findstring::replaceostringstream,这些代码确实如此:

#include <iostream>
#include <string>
#include <algorithm>
#include <sstream>

using namespace std;

template<typename T>
string makestr(const T& val_)
{
    std::ostringstream buf;
    buf << val_;
    return buf.str();
}

void instantiateVariable(string expr, char var_, int val_)
{
    string::iterator it = find(expr.begin(), expr.end(), var_);
    if (it != expr.end())
    {
        expr.replace(it, it+1, makestr(val_));
    }
    cout << expr;
}

int main()
{
    string expr_ =  "x + (3 + 4)";
    instantiateVariable(expr_, 'x', 22);
}

编辑:现在我考虑一下,我宁愿使用string::find支持find算法,因为它需要更少的代码并且看起来更直观:

void instantiateVariable(string expr, char var_, int val_)
{
    size_t i = expr.find(var_);
    if (i != string::npos)
    {
        expr.replace(i, 1, makestr(val_));
    }
    cout << expr;
}

提示:如果您使用的是C ++ 11,则可以使用std::to_string代替makestr功能。

答案 2 :(得分:1)

两件事:一个是,你发送的是变量的名称而不是它们的值,而这些名称根本就不起作用。其次,对于你的第二个参数,你应该使用一个字符值,例如'3',而不是整数值。