2017-07-25 94 views
1

如標題所示,如何用另一個字符串替換字符串?例如:用戶將輸入三個輸入。第一個輸入是程序將替換的字符串;第二個是將替換input1的字符串;第三個是打印出的字符串。所以,如果:用文本流替換所有出現的一個字符串

輸入1 =花生

輸入2 =椰

輸入3 =取代花生更換

輸出:更換椰子更換

我已經開始,但我的計劃只能替換長度相同的單詞。我試圖尋找我的問題,但我不明白給定的解決方案,因爲我只是新的C/C++。

char replacing[100]; 
char replacement[100]; 
char original[1000]; 
int count; 

cin >> replacing; 
cin >> replacement; 

while(! cin.eof()) 
{ 
    cin >> original; 

    char * pch; 


    pch = strstr (original, replacing); 

    count = strlen(replacement); 
    strncpy (pch, replacement, count); 


    cout << original << endl; 

} 
+2

如果你想學習C++,請去學習C++。你的問題可以在這裏找到(https://stackoverflow.com/questions/3418231/replace-part-of-a-string-with-another-string)。如果你想學習C語言,那麼請僅學習C語言,並查看'strncpy'的功能。不要混用它。這樣,你最終做錯了*兩種方式。 – nvoigt

+1

嘗試使用'std :: string'。它有成員函數來查找子字符串並替換它的一部分。從輸入流中讀取很容易。 – Peter

+0

您可能也有興趣[爲什麼'iostream :: eof'在循環條件內被認爲是錯誤的?](/ q/5605125) –

回答

1

什麼:

  • 你首先找到(如果有的話)字符串的出現
  • 使用替換第二個字符串替換髮生

這裏是什麼應該工作:

bool replaceFirst(string& input, const std::string& toBeReplaced, const std::string& replacement) { 
    size_t start_pos = input.find(toBeReplaced); 
    if(start_pos == std::string::npos) 
     return false; //substring not found! 

    input.replace(start_pos, toBeReplaced.length(), replacement); //found. now i can replace! 
    return true; 
} 

由於您使用的是字符數組而不是string,因此您必須確保替換不會導致出界(字符串自動調整大小)。

+0

'from'似乎沒有在您的代碼示例中定義。 –

+0

@AlgirdasPreidžius修復。 –

+0

問題仍然存在:'str.find(from);'。 –

0

關鍵問題是strncpy不分配(或釋放)任何內存。這意味着如果replacement短於replacing,則replacing的一部分不會被覆蓋。同樣,如果replacement更長,它將覆蓋超過replacing的末尾。

如前所述,如果使用std::string(或者其他一些C++字符串類,如Qt的QString,如果Qt是你的一杯茶),會更好。其他

一個小東西,一般與流最好不要只檢查eof,而喜歡寫東西

while (cin >> original) { 

這如果流在任何故障狀態,而不僅僅是eof將終止。

相關問題