英文書寫中,句首字母通常為大寫,其余為小寫,單詞“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 }
