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中,以此类推。
参考链接: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++;
}
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++;
}
}