不用考虑效率,考虑正确性。 #include <iostream> #include <cstdlib> #include <cassert> #include <string> #include <algorithm> using namespace std; string Krunch(const string &s) { string ret; string removed = "AEIOU"; int i = 0; while(0 <= i && i < s.size()) { i = s.find_first_not_of(removed, i); if(i == string::npos) { break; } if(s[i] == '.' || s[i] == ',' || s[i] == '?' || s[i] == ' ') { if(!ret.empty() && *ret.rbegin() == ' ') { *ret.rbegin() = s[i]; } else { ret += s[i]; } } else { assert('A' <= s[i] && s[i] <= 'Z'); ret += s[i]; removed += s[i]; } ++i; } ret = ret.substr(ret.find_first_not_of(" ")); ret = ret.substr(0, ret.find_last_not_of(" ") + 1); return ret; } int main() { string s; while(getline(cin, s)) { cout << Krunch(s) << endl; } return 0; }