【问题标题】:Replacing a specific char in a string with a value用值替换字符串中的特定字符
【发布时间】:2014-08-06 21:12:26
【问题描述】:

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

我做错了什么?

#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);
}

【问题讨论】:

  • 您需要弄清楚如何从int 转到代表int 值的char。然后你需要弄清楚如何正确引用变量(提示:var_'var_' 不同)。

标签: c++ string replace char


【解决方案1】:

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】:

    去掉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

    【讨论】:

    • @Joe_B 在所有建议的更改之后,它是否如您所愿?
    • 它说:没有匹配的函数调用 replace(std::basic_string::iterator, std::basic_string::iterator, char&, int&)'|
    • @Joe_B 是的,你有 val_ 作为 int。在有限的情况下,将其更改为 char 会起作用。
    • 如果我理解正确的话,他的意图是将表达式字符串中的变量替换为传递给函数的整数。所以转换应该发生在函数内部,而不是调用者端。
    • @BenjaminLindley 我相信我的最后一次编辑解决了这一点。
    【解决方案3】:

    两件事:一是,您正在发送 replace() 变量的名称而不是它们的值,这根本不起作用。其次,对于您的第二个参数,您应该使用字符值,例如“3”,而不是整数值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多