我一直在尝试使用替换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);
}
}
在结尾处输入保持不变。
我在这里做错了什么?
此致
答案 0 :(得分:1)
在我看来,缺少两项检查:
endString
,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
答案 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);
}