100分
#include <bits/stdc++.h> using namespace std; int main() { string line; cin >> line; map<char, bool> dct; // true:带参数 false:不带参数 for (int i = 0; i < line.size(); i++) { if (line[i] != ':') { dct.insert(pair<char, bool>(line[i], false)); } else { dct[line[i - 1]] = true; } } int n; cin >> n; cin.ignore(); // 忽略回车 string s; map<string, string> res; for (int i = 0; i < n; i++) { res.clear(); string temp; // 指令 getline(cin,s); stringstream ss(s); ss >> temp; while (ss >> temp) { if (temp[0] == '-' && dct.find(temp[1]) != dct.end()) { // 合法字母 if (dct[temp[1]]) { // 带参数 string arg; if (ss >> arg) { if (res.find(temp) != res.end()) { // 命令选项存在 res[temp] = arg; } else { // 数据不存在 res.insert(pair<string, string>(temp, arg)); } } else break; } else { // 不带参数 res.insert(pair<string, string>(temp, "")); } } else // 不合法 break; } cout << "Case " << i + 1 << ": "; map<string, string>::iterator it; for (it = res.begin(); it != res.end(); it++) { cout << it->first << " "; if (it->second != "") { cout << it->second << " "; } } cout << endl; } return 0; }
一些解释
stringstream ss(s);
ss>>temp;
在这段代码中,第一个从stringstream中提取的字符串会被存储在变量temp中,该单词会包含所有不包含空格的字符,不包括空格本身。一次提取的单词是以空格为分隔符的连续字符序列,因此,如果读取到的字符串是"Hello World",那么temp将存储"Hello"。如果要读取下一个单词,只需再次使用ss>>temp代码即可。这会将下一个单词读取到temp中,以此类推。
30分(待修改)
#include <bits/stdc++.h> using namespace std; string cinn; struct xx { char a; bool flag = false; // 0:无参数 1有参数 string canshu; // 小写字母+数字+减号 } x[300]; map<char, bool> f; // 字母,是否带参数 bool cmp(string a, string b) { if (a[1] < b[1]) return true; return false; } int main() { cin >> cinn; int k = 0; // 0开始 for (int i = 0; i < cinn.size(); i++) { if (cinn[i] == ':') { x[k - 1].flag = 1; } else { x[k].a = cinn[i]; k++; } } for (int i = 0; i < k; i++) { f.insert(make_pair(x[i].a, x[i].flag)); // 存命令行里合法的选项 } int n; cin >> n; vector<string> v; int uu = 1; while (n--) { v.clear(); string l; string a; cin >> a; getline(cin, l); // getline(cin,str);有时会读取上一行的"\n" // getline(cin,str)的读取原理是将以‘/n’为结束符做为一完整读取的一行,'/n'会读。 // 所以在getline前面加入cin.ignore()或者读入的数忽略,这个就会忽略那个回车 int flag = 0; for (int i = 0; i < l.size(); i++) { if (flag == 0 && l[i] == ' ') // 找到第一个空格,这个空格前面的不读 { flag = 1; if (i == l.size() - 1) // 如果后面没东西,直接break后输出Case x: { v.push_back(""); break; } } else if (flag == 1) // 开始保存合法的选项以及合法的参数 { int ii = i + 1; if (l[i] == '-' && f.find(l[ii]) != f.end()) // 第一个为'-'并且字母合法 { if (f[l[ii]] == 0) { // 无参数,只存合法命令 // 合法命令为'-'+一个小写字母 if (l[i] != '-') //'-' break; i++; string y; y += "-"; if (l[i] >= 'a' && l[i] <= 'z') // 小写字母 { y += l[i]; i++; } else break; v.push_back(y); } else if (f[l[ii]] == 1) { // 有参数,只存合法命令+合法参数 if (l[i] != '-') //'-' break; i++; string y; y += "-"; if (l[i] >= 'a' && l[i] <= 'z') // 命令: 小写字母 { y += l[i]; i++; } else break; i++; y += " "; int fl = 0; while (l[i] != ' ' && i < l.size()) // 参数 { if ((l[i] >= 'a' && l[i] <= 'z') || (l[i] >= '0' && l[i] <= '9') || l[i] == '-') { y += l[i]; i++; } else { fl = 1; break; } } if (fl == 1) { break; } v.push_back(y); } } else break; } } sort(v.begin(), v.end(), cmp); v.erase(unique(v.begin(), v.end()), v.end()); cout << "Case " << uu << ": "; for (int i = 0; i < v.size(); i++) { if (v[i][1] == v[i + 1][1] && i + 1 < v.size()) { v.erase(v.begin() + i); } } for (auto t : v) { cout << t << " "; } cout << endl; uu++; } }