2013-11-15 45 views
0

我正在解决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

为什么你需要文本替换算法来将狄摩根定律转换为给定的布尔表达式? – Manu343726

回答

2

你可以搜索字符串的位置,那么每个字符分配给原始字符串:

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]; 
    } 
} 

这种解决方案的一点是,没有理由使用昂贵的字符串连接来代替文本

+0

如果您正在替换的文本的长度会是多少!=您正在输入的文本的长度是多少? –

+0

@BrianGradin我以为替换文本总是适合原始的搜索字符串。当然,如果那不是真的,这个解决方案不起作用,你需要拆分和重新整理字符串。我的观点是,并不总是你应该使用昂贵的连接。 – Manu343726

1

有三个部分结果字符串的想:

  • 原始字符串
  • 替换文本
  • 结局的开始部分部分原始字符串

您可以使用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()); 
相关问题