所以我有一个我正在阅读的字符串文件,我必须用其他值替换它们中的某些值。可能的替换量是可变的。如同,它从文件中读取要替换的模式。目前我正在vector<pair<string,string>>
存储模式以查找和匹配。但是我遇到了问题:
示例:
输入字符串:
abcd.eaef%afas&333
分隔符模式:
. %%%
% ###
& @@@
我想要的输出:
abcd%%%eaef###afas@@@333
输出我得到:
abcd#########eaef###afas@@@333
问题是它最终取代%
符号或任何已经替代其他东西的符号,它不应该这样做。
我的代码是(相关部分):
std::string& replace(std::string& s, const std::string& from, const std::string& to){
if(!from.empty())
for(size_t pos = 0; (pos = s.find(from, pos)) != std::string::npos; pos += to.size()) s.replace(pos, from.size(), to);
return s;
}
string line;
vector<pair<string, string>> myset;
while(getline(delimiterfile, line)){
istringstream is(line);
string delim, pattern;
if(is >> delim >> pattern){
myset.push_back(make_pair(delim, pattern));
} else {
throw runtime_error("Invalid pattern pair!");
}
}
while(getline(input, line)){
string temp = line;
for(auto &item : myset){
replace(temp, item.first, item.second);
}
output << temp << endl;
}
有人可以告诉我我搞砸了什么以及如何解决它?
答案 0 :(得分:2)
在伪代码中,简单的替换算法可能如下所示:
string input = getline();
string output; // The string containing the replacements
for (each char in input)
{
if (char == '.')
output += "%%%";
// TODO: Other replacements
else
output += char;
}
如果你实现上面的代码,一旦完成,变量output
将包含所有替换的字符串。
答案 1 :(得分:0)
我建议您使用stringstream。通过这种方式,您将能够非常轻松地实现您的目标。