std :: string在start和end之间替换

时间:2013-11-26 06:40:02

标签: c++ replace substring

我一直在尝试使用替换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);
    }
}

在结尾处输入保持不变。

我在这里做错了什么?

此致

2 个答案:

答案 0 :(得分:1)

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

  1. 如果找不到endString
  2. 如果在 endString之前找到startString ,在这种情况下,计算replace()的第二个参数的减法将导致负长度溢出。
  3. 此外,您可能希望返回一个布尔值来检查是否存在匹配。

    尝试这样的事情:

    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
    

答案 1 :(得分:0)

这个答案与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);
}