題目1111:單詞替換 輸入一個字元串,以回車結束(字元串長度<=100)。該字元串由若幹個單片語成,單詞之間用一個空格隔開,所有單詞區分大小寫。現需要將其中的某個單詞替換成另一個單詞,並輸出替換之後的字元串。 多組數據。每組數據輸入包括3行, 第1行是包含多個單詞的字元串 s, 第2行是待替換的單 ...
題目1111:單詞替換
- 題目描述:
-
輸入一個字元串,以回車結束(字元串長度<=100)。該字元串由若幹個單片語成,單詞之間用一個空格隔開,所有單詞區分大小寫。現需要將其中的某個單詞替換成另一個單詞,並輸出替換之後的字元串。
- 輸入:
-
多組數據。每組數據輸入包括3行,
第1行是包含多個單詞的字元串 s,
第2行是待替換的單詞a,(長度<=100)
第3行是a將被替換的單詞b。(長度<=100)
s, a, b 最前面和最後面都沒有空格.
- 輸出:
-
每個測試數據輸出只有 1 行,
將s中所有單詞a替換成b之後的字元串。
- 樣例輸入:
-
You want someone to help you You I
- 樣例輸出:
-
I want someone to help you
#include <iostream> #include <string> using namespace std; int main() { string s, a, b; while(getline(cin, s)) { getline(cin, a); getline(cin, b); for(int i = 0; i < s.length(); i++) { if(s.length() - i >= a.length()) { if(s.substr(i, a.length()) == a && (i == 0 || s[i - 1] == ' ') && (i == s.length() - a.length() || s[i + a.length()] == ' ')) { s.replace(i, a.length(), b); } } else break; } cout << s << endl; } return 0; } /************************************************************** Problem: 1111 User: 文劍木然 Language: C++ Result: Accepted Time:0 ms Memory:1520 kb ****************************************************************/
【總結】
對於C++中的字元串操作還比較陌生,代碼寫得比較繁瑣。
主要註意要點:
1、cin >> s 會將空格作為輸入結束,所以要用getline(cin, s)。
getline還有一些細節上的問題需要註意。
2、要註意判斷單詞邊界
之前的錯誤答案:
#include <iostream> #include <string> using namespace std; int main() { string s, a, b; while(getline(cin, s)) { getline(cin, a); getline(cin, b); if(s.length() >= a.length()) { for(int i = 0; i <= s.length() - a.length(); i++) { if(s.substr(i, a.length()) == a && (i == 0 || ' ' == s[i - 1]) && (i == s.length() - a.length() || ' ' == s[i + a.length()])) { s.replace(i, a.length(), b); } } } cout << s << endl; } return 0; } /************************************************************** Problem: 1111 User: 文劍木然 Language: C++ Result: Runtime Error ****************************************************************/
【錯誤分析】
當輸入為
you
you
i
時,會發生錯誤。
terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr: __pos (which is 2) > this->size() (which is 1)
因為,執行替換後,迴圈終止條件
i <= s.length() - a.length()
恆滿足,也就是i的值將不斷增加,然後導致越界。