L1-8 2017final英文语句格式简单检查 (20分)
英文书写中,句首字母通常为大写,其余为小写,单词“I”除外,单词与单词之间用一个空格隔开,句中用“,”断句,句末用“.”结束,“,”和“.”与其前置单词间无需空格隔开。 Word等文本编辑器通常根据以上规则,对我们输入的英文语句进行自动修正。 请编写一个功能,可对输入的一句英文句子,根据以上规则,修订为正确格式后输入。 例如,对于输入的英文句子“This is an Example with one mistake.”, 由于单词“Example”中的字符"E"应该为小写"e",所以修订后输出该句子的正确格式 This is an example with one mistake.
注意:
1、 每组测试数据仅包括一个以字符“.”结束的英文句子。
2、 输入的英文句子中出现的字符包括二十六个大写英文字母(ASCII码65~90),二十六个小写英文字母(ASCII码97~122),“,”和“.”,空格字符。
输入格式:
以字符“."为结束字符的一个英文句子。
输出格式:
输入英文句子经过格式纠错后的输出。
输入样例:
This is an Example with one mistake.
输出样例:
This is an example with one mistake.
思路
测试了这些测试点就可以了
输入
i ajhas HjaHHAI, , ajj ,I.
, , , sjhhhqHjGAHhIjjas ,.
S,djojd doja kdaI.
输出(与输入一一对应)
I ajhas hjahhai, ajj, I.
, , , sjhhhqhjgahhijjas, .
S, , djojd doja kdai.
key point
1, 凡是有逗号的地方其后面都要加空格
2 首字母大写
3 形如 “ i “, ” i,“ i."的i都要变成大写
4 以句号结束, 其他字符小写
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s1;
getline(cin, s1);
for(int i = 0; i < s1.size(); i++)
{
s1[i] = tolower(s1[i]);
if(s1[i] == ',') // 在逗号后面加空格
s1.insert( ++i, " ");
}
string s2 = s1;
stringstream ss(s1); //流输出取消多个连续空格
string ans = "";
while(ss >> s1)
{
if(s1.size() == 1 && (s1[0] == ',' || s1[0] == '.'))//如果是标点
{
if(ans.size() == 0) ans = s1 + " ";//ans第一个字符不为空格
else //ans中有单词了
{
int x3 = ans.size();
if(!isalpha(ans[x3 - 2])) ans = ans + s1 + " "; //如果上个单词为标点
else ans.insert(x3 - 1, s1);//不为标点直接插入上个单词右侧
}
}
else ans = ans + s1 + " ";//单词直接相加
}
int x1 = 0;
while(x1 != -1)
{
x1 = ans.find(" i", x1);
if(x1 == -1) break;
if(!isalpha(ans[x1 + 2])) // 如果i后面是标点或者空格就变成大写
ans[x1 + 1] = 'I';
x1 ++;
}
ans[0] = toupper(ans[0]);//首字母大写
ans.erase(ans.size() - 1); //去掉最后一个空格
cout << ans << endl;
return 0;
}