題目1111:單詞替換
輸入一個字符串,以回車結束(字符串長度<=100)。該字符串由若干個單詞組成,單詞之間用一個空格隔開,所有單詞區分大小寫。現需要將其中的某個單詞替換成另一個單詞,並輸出替換之後的字符串。
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的值將不斷增加,然後導致越界。