本文主要是介绍201403-3 命令行选项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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));}}elsebreak;}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中,以此类推。
参考链接:https://blog.csdn.net/qq_45727086/article/details/129467289
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++;}elsebreak;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++;}elsebreak;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);}}elsebreak;}}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++;}
}
这篇关于201403-3 命令行选项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!