ZeroJudge K515: 標題 (Title)

有一種標題格式稱為「title case」,其將所有單字的首字母採用大寫格式,其它字母則採小寫。不過以下這些冠詞、介系詞及連接詞「the、a、an、in、on、at、of、for、by、to、and、or、but」,只有當它們是第一個單字或最後一個單字時才需首字母大寫

舉例來說,海明威作品《戰地鐘聲》英文名稱以前述格式呈現為「For Whomthe Bell Tolls」,費茲傑羅之作品《大亨小傳》英文名稱呈現為「The Greal Gaisby」。
請你撰寫一個程式,給定一個題目標題,請你將該標題依照「title case」的規定,將其修正成符合標題規定的格式。

範例測資

範例輸入範例輸出
輸入為一長度不超過 500 字元的字串,只會包含大小寫英文字母,單字與單字間以一個空白隔開。請輸出一個字串,為修正過後的題目標題。
ironweedIronweed
WiDe sargaSSOWide Sargasso
The SOUND and FURYThe Sound and Fury
for whom the bell tollsFor Whom the Bell Tolls
The catcher In THe ryeThe Catcher in the Rye
what men live byWhat Men Live By

解題思路

使用 EOF 的方式將字串收起來,每次收到資料時就將該字串 Push_Back 到一個 Vector 中。

將所有字母先變成小寫的,如果該字串為第一個或最後一個就將第一個字元大寫,如果不是且是特殊字串 (the、a、an、in、on、at、of、for、by、to、and、or、but) 就不做更動進行輸出,如果都不是就將第一個字元大寫並輸出。

範例程式碼-ZeroJudge K515: 標題 (Title)

#include <iostream>
#include <vector>
using namespace std;

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    string str;
    vector<string>v;
    while (cin >> str) v.push_back(str);
    for (int i = 0; i<v.size(); i++) {
        for (int j = 0; j<v[i].length(); j++) v[i][j] = tolower(v[i][j]);
        if (i == 0 || i == v.size()-1) {
            v[i][0] = toupper(v[i][0]);
            cout << v[i] << " ";
            continue;
        }
        string s = v[i];
        if (s == "the" || s == "a" || s == "an" || s == "in" || s == "on" || s == "at" || s == "of" || s == "for" || s == "by" || s == "to" || s == "and" || s == "or" || s == "but") {
            cout << s << " ";
        }
        else {
            s[0] = toupper(s[0]);
            cout << s << " ";
        }
    }
    cout << "\n";
}

//ZeroJudge K515
//Dr. SeanXD

發佈留言