使用格式化字符串"%[^...]"
,这种字符串的作用类似于"%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 }