英文书写中,句首字母通常为大写,其余为小写,单词“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),“,”和“.”,空格字符。
测试用例:
an I i ,, , i,i, i i i,I,I I I I, aN,n,iI, iI iI,.
输出结果:
An I I, I, I, I I I, I, I I I i, an, n, iI, iI iI.
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 int main() 6 { 7 char *transform(char *); //用于大小写的转换 8 string str, result, space(" "), point("."); //str用于输入,result用于接收结果,space用于添加空格,point用于添加句号 9 bool flag(true); //flag用于判断是否刚出现过逗号(即是否需要添加空格) 10 int pos(0); //pos指向正在被判断的字母 11 getline(cin, str); 12 13 if('a' <= str[pos] && str[pos] <= 'z') //首字母是否为大写 14 result.append(transform(&str[pos]), 1); 15 else 16 result.append(&str[pos], 1); // 17 18 while(str[++pos] != '.') //对每一个字母进行检查,句号不检查 19 { 20 if(!flag && str[pos] != ' ') //如果刚出现逗号且正在判断的字母不为空格,则添加空格 21 { 22 result.append(space); 23 flag = true; 24 } 25 26 if(flag) 27 { 28 if(str[pos] == 'I' && (str[pos - 1] == ' ' || str[pos - 1] == ',') && (str[pos + 1] == ' ' || str[pos - 1] == ',' || str[pos - 1] == '.')) //如果I为大写,且是单独字符,直接输出 29 { 30 result.append(&str[pos], 1); 31 } 32 else if(str[pos] == 'i' && (str[pos - 1] == ' ' || str[pos - 1] == ',') && (str[pos + 1] == ' ' || str[pos + 1] == ',' || str[pos + 1] == '.')) //如果i为小写,且是单独字符,转换后输出 33 { 34 result.append(transform(&str[pos]), 1); 35 } 36 else if('A' <= str[pos] && str[pos] <= 'Z') //如果字母为大写,则转换后输出 37 { 38 result.append(transform(&str[pos]), 1); 39 } 40 else if(str[pos] == ',') //如果字母为',' 41 { 42 for(int i(1); str[pos + i] != '.'; i++) //判断:1.如果之后为空格,则继续向后移动 2.如果之后为','、'.',则将pos位移至该符号 3.如果为大写或小写,则直接输出逗号 43 { 44 if(str[pos + i] == ' ') 45 continue; 46 else if(str[pos + i] == ',' || str[pos + i] == '.') 47 { 48 pos += i - 1; 49 break; 50 } 51 else 52 { 53 result.append(&str[pos], 1); 54 flag = false; 55 break; 56 } 57 } 58 } 59 else if(str[pos] == ' ') //如果字母为空格 60 { 61 for(int i(1); str[pos + i] != '.'; i++) //判断:1.如果之后为空格,则继续向后移动 2.如果之后为','、'.',则将pos位移至该符号 3.如果之后为字母,则输出空格并将pos位移至该字母 62 { 63 if(str[pos + i] == ' ') 64 continue; 65 else if(str[pos + i] == ',' || str[pos + i] == '.') 66 { 67 pos += i - 1; 68 break; 69 } 70 else 71 { 72 result.append(space); 73 pos += i - 1; 74 break; 75 } 76 } 77 } 78 else //如果判断字符为小写字母,则直接输出 79 { 80 result.append(&str[pos], 1); 81 } 82 } 83 } 84 85 result.append(point); //结尾添加句号 86 cout << result; 87 return 0; 88 } 89 90 char *transform(char *ch) 91 { 92 if('A' <= *ch && *ch <= 'Z') 93 *ch += 32; 94 else if('a' <= *ch && *ch <= 'z') 95 *ch -= 32; 96 97 return ch; 98 }