【九度OJ】题目1111:单词替换
题目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的值将不断增加,然后导致越界。