我正在解决Reddit上的挑战here
我无法找到如何用另一个字符串替换字符串的特定文本。我设法找出如何检查特定文本是否存在,但是我在用其他文本替换它或将其从字符串中完全删除时遇到了问题(正如挑战所要求的那样)。
到目前为止,这是我的代码:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int law (string a);
int main() {
string a;
cin >> a;
cout << law(a) << endl;
return 0;
}
int law(string a){
if (a.find("NOT") != string::npos)
return a.replace(a.begin(), a.end(), ' ');
if(a.find("NOT") != string::npos && ((a.find("AND") == string::npos) || (a.find("OR") == string::npos)))
return a.erase(remove(a.begin(), a.end(), "NOT"), a.end());
}
答案 0 :(得分:3)
您可以搜索子字符串位置,然后将每个字符分配给原始字符串:
void replace( std::string& input_string , const std::string& searched_string , const std::string& replace_string )
{
std::size_t replace_pos = input_string.find( searched_string );
if( replace_pos != std::string::npos )
{
std::copy( std::begin( replace_string ) ,
std::end( replace_string ) ,
std::begin( input_string ) + replace_pos
);
//Or with a simple for loop (Which is what std::copy does):
for( std::size_t i = 0 ; i < replace_string.size() ; ++i )
input_string[i + replace_pos}] = replace_string[i];
}
}
此解决方案的重点是没有理由使用昂贵的字符串连接来替换文本。
答案 1 :(得分:2)
想想结果字符串有三个部分:
您可以使用string.substr()
获取原始字符串的开头和结尾部分。代码看起来像这样:
string originalString; // given
string partToReplace; // given
string replacementText; // given
int positionOfText = originalString.find(partToReplace);
string resultString = originalString.substr(0, positionOfText);
resultString += replacementText;
resultString += originalString.substr(positionOfText + partToReplace.length());