2013-11-15 44 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()); 
相關問題