我想替换字符串中的特定字符,我有以下代码来尝试这个,但它不能像我希望的那样工作。它只输出原始字符串。
我做错了什么?
#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);
}
答案 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
,因此还需要先进行转换。我为您准备了一个小示例代码,其中显示了如何使用find
,string::replace
和ostringstream
,这些代码确实如此:
#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',而不是整数值。