PAT 乙級 1009
一、題目
說反話
給定一句英語,要求你編寫程序,將句中所有單詞的順序顛倒輸出。
輸入格式:測試輸入包含一個測試用例,在一行內給出總長度不超過80的字符串。字符串由若幹單詞和若幹空格組成,其中單詞是由英文字母(大小寫有區分)組成的字符串,單詞之間用1個空格分開,輸入保證句子末尾沒有多余的空格。
輸出格式:每個測試用例的輸出占一行,輸出倒序後的句子。
輸入樣例:
Hello World Here I Come
輸出樣例:
Come I Here World Hello
二、題解
本題本身屬於比較簡單的字符串操作題,但是因為對於string的操作和函數不熟悉導致本題做起來很費勁,需要加強對於string類以及相關方法的理解和熟練程度。
1. string讀取字符串時,默認以空格或者回車作為結束輸入的標誌,所以在本題中,如果用string的普通輸入無法完整讀入數據,因此需要使用getline方法
getline()
頭文件:#include <string>
函數原型:getline(istream &is,string &str,char delim)
主要功能:讀入整行數據,不把空格作為判斷輸入結束的條件,默認是回車,可以自行設置結束條件
istream &is表示一個輸入流,譬如cin,string表示把從輸入流讀入的字符串存放在這個字符串中(&str其實就是一個變量),char delim是終止符(默認為回車,還可以是別的符號,如#,*之類的都可以)
2. 如果需要對某一個字符串進行切片處理時,本題中用到的方法是substr()
substr()
頭文件:#include <string>
函數原型:substr(size_t pos = 0, size_t len = npos)
主要功能:復制某一範圍內的子字符串,要求從指定位置開始,並具有指定的長度
三、代碼
1 #include <iostream>
2 #include <string>
3 #include <vector>
4 using namespace std;
5
6 int main() {
7 string str;
8 vector<string> out_str;
9 getline(cin, str);
10 str[str.size()] = ‘ ‘;
11 int start = 0, cnt = 0;
12 string tmp;
13 for (int i = 0; i < (str.size() + 1); i++) {
14 if (str[i] == ‘ ‘) {
15 tmp = str.substr(start, cnt);
16 out_str.push_back(tmp);
17 start = i + 1;
18 cnt = -1;
19 }
20 cnt++;
21 }
22 for (int i = out_str.size() - 1; i >= 0; i--) {
23 cout << out_str[i];
24 if (i != 0)
25 cout << ‘ ‘;
26 }
27
28 return 0;
29 }
PAT 乙級 1009