1. 程式人生 > 實用技巧 >PTA 乙級 1052 賣個萌 (20分) C++

PTA 乙級 1052 賣個萌 (20分) C++

使用格式化字串"%[^...]",這種字串的作用類似於"%s",前者使scanf讀到^後面的字元,但是後者會讀取字串到空白字元(空格、換行、製表符等等),相當於使用者可以自定義scanf的行為(只能用char字串去儲存輸入得到的格式化字串)

利用vector<vector<string>>來儲存所有表情,進行push_back()括號內必須為vector<string>(意味著還需要建立另一個vector儲存表情)

注意:

  • 測試點1,2:注意下標越界的問題,輸入的數字從1開始(表情數字輸入包含0和複數負數)
  • 手和眼之間有 '(' ')'
  • 輸出的轉義字元,"Are you kidding me? @\\/@"
 1 #include<iostream>
 2 #include<vector>
 3 
 4 using namespace std;
 5 
 6 int main() {
 7     /*計數*/
 8     int n = 0, f[5];
 9     char c;
10     /*單個表情*/
11     char ss[5];
12     /*手眼口所有表情*/
13     vector<vector<string>> body;
14     for (int i = 0; i < 3; i++) {
15         vector<string
> s; 16 while ((c = getchar()) != '\n') { 17 if (c == '[') { 18 scanf("%[^]]", ss); //利用scanf的格式化輸入,識別"[]" 19 s.push_back(ss); 20 } 21 } 22 body.push_back(s); 23 } 24 cin >> n; 25 for (int i = 0
; i < n; i++) { 26 for (int j = 0; j < 5; j++) cin >> f[j]; 27 if ((f[0] > 0 && f[0] <= body[0].size()) 28 && (f[1] > 0 && f[1] <= body[1].size()) 29 && (f[2] > 0 && f[2] <= body[2].size()) 30 && (f[3] > 0 && f[3] <= body[1].size()) 31 && (f[4] > 0 && f[4] <= body[0].size())) { //防止下標越界 32 cout << body[0][f[0] - 1] << '(' << body[1][f[1] - 1] 33 << body[2][f[2] - 1] << body[1][f[3] - 1] << ')' 34 << body[0][f[4] - 1] << endl; 35 } 36 else { 37 cout << "Are you kidding me? @\\/@" << endl; //注意'\'轉義字元,'\\'才可輸出'\' 38 } 39 40 } 41 }