赞
踩
☞原博客
在原博客代码的基础上我自己改进了一下,而且加上了注释:
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; getchar(); while (n--) { string s; getline(cin, s); //1) cout << s << endl; //2) while (s[0] == ' ')//删除行首空格 s.erase(s.begin()); while (s[s.size() - 1] == ' ')//删除行尾空格 s.erase(s.end() - 1); for (int i = 0; i<s.size(); i++) { if (s[i] == ' ') { while (s[i + 1] == ' ')//删除多个相连的空格 s.erase(s.begin() + i + 1); if (!isalnum(s[i + 1]))//删除标点前的空格 s.erase(s.begin() + i); } } //3) for (int i = 0; i<s.size(); i++) { if (s[i] >= 'A'&&s[i] <= 'Z'&&s[i] != 'I')//大写字母转换为小写字母 s[i] +=32 ; } //4) for (int beg = 0;; beg++) { beg = s.find("can you", beg);//一位位的找,避免找到的第一个不是“独立”的而造成死循环 if (beg == -1) break; if ((beg == 0 || !isalnum(s[beg - 1])) && (beg + 7 == s.size() || !isalnum(s[beg + 7])))//行首或者前面为标点同时行尾或者后面为标点 s.replace(beg, 7, "A can");//由于后面还要处理'I'这里先用'A'代替'I',最后在变成'I' } for (int beg = 0;; beg++) { beg = s.find("could you", beg); if (beg == -1) break; if ((beg == 0 || !isalnum(s[beg - 1])) && (beg + 9 == s.size() || !isalnum(s[beg + 9])))//行首或者前面为标点同时行尾或者后面为标点 s.replace(beg, 9, "A could");//由于后面还要处理'I'这里先用'A'代替'I',最后在变成'I' } //5) for (int beg = 0;; beg++) { beg = s.find("I", beg); if (beg == -1) break; if ((beg == 0 || !isalnum(s[beg - 1])) && (beg + 1 == s.size() || !isalnum(s[beg + 1])))//行首或者前面为标点同时行尾或者后面为标点 s.replace(beg, 1, "you"); } for (int beg = 0;; beg++) { beg = s.find("me", beg); if (beg == -1) break; if ((beg == 0 || !isalnum(s[beg - 1])) && (beg + 2 == s.size() || !isalnum(s[beg + 2])))//行首或者前面为标点同时行尾或者后面为标点 s.replace(beg, 2, "you"); } //6) for (int i = 0; i<s.size(); i++) { if (s[i] == '?') s[i] = '!'; if (s[i] == 'A') s[i] = 'I'; } //7) cout << "AI: " << s << endl; } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。