【问题标题】:std::string replace between start and endstd::string 在开始和结束之间替换
【发布时间】:2013-11-26 06:40:01
【问题描述】:

我一直在尝试使用替换 std::string 但未能成功。

我有一个大字符串,我想在其中做一些替换。 我知道子字符串的开始和结束需要用新的替换。

static void replaceString(string &input, const string &startString, const string &endString, const string &replacement)
{
    size_t indexStart, indexEnd;

    indexStart = input.find(startString);
    indexEnd = input.find(endString);
    if (indexStart != xml.npos) {
        input.replace(indexStart, indexEnd-indexStart, replacement);
    }
}

最后输入保持不变。

我在这里做错了什么?

问候

【问题讨论】:

  • 什么是 xml in line if(indexStrat != xml.npos) ?
  • 你对函数有什么输入?如果找不到endString 怎么办?
  • xml 是一个错字。这是输入。
  • @chingupt 您的输入、预期输出和观察到的输出是什么?
  • 好吧,那么我建议在if 子句中打印出输入值,紧跟在replace 之后,然后从那里返回。你没有向我们展示足够的帮助。例如,可能是您的调用者提供了 xml 字符串的副本,因此您仍然没有按照您期望的值进行操作,或者是其他几十个小错误中的任何一个。

标签: c++ replace substring


【解决方案1】:

在我看来,缺少两个检查:

  1. 如果没有找到endString
  2. 如果endString 被发现之前 startString,在这种情况下,计算replace() 的第二个参数的减法将导致负长度,这将溢出。

此外,您可能希望返回一个布尔值来检查是否存在匹配项。

试试这样的:

static bool replaceString(string &input, const string &startString, const string &endString, const string &replacement)
{
    size_t indexStart, indexEnd;
    indexStart = input.find(startString);
    if (indexStart == input.npos) {
        return false;
    }
    indexEnd = input.find(endString, indexStart); // Note the offset to start searching
                                                  // after the start index
    if (indexEnd == input.npos) {
        return false;
    }
    input.replace(indexStart, indexEnd-indexStart, replacement);
    return true;
}

测试程序:

int main (int, char**)
{
    string s ("abcdefghijklmnopqrstuvwxyz");

    string start ("gh");
    string end ("pq");
    string replace ("GHIJKLMNO");
    bool ok = replaceString(s, start, end, replace);

    std::cout << "1. found? " << ok << ", result: " << s << std::endl;

    start = "pq";
    end = "de";
    ok = replaceString(s, start, end, replace);

    std::cout << "2. found? " << ok << ", result: " << s << std::endl;

    return 0;
}

输出:

1. found? true, result: abcdefGHIJKLMNOpqrstuvwxyz
2. found? false, result: abcdefGHIJKLMNOpqrstuvwxyz

【讨论】:

    【解决方案2】:

    这个答案与 Julien-L 的类似,但我认为您还需要提前 indexStart,这样替换不会覆盖任何找到的 startString

    static void replaceString(std::string &input, const std::string &startString, const std::string &endString, const std::string &replacement)
    {
        size_t indexStart = input.find(startString);
        if (indexStart == input.npos) return;
        indexStart += startString.size();
    
        size_t indexEnd = input.find(endString, indexStart);
        if (indexEnd == input.npos) return;
    
        input.replace(indexStart, indexEnd - indexStart, replacement);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-19
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多