题目描述
问题分析 :
从第3行开始对于每个输入的字符串内是否存在合理的 第一行输入的各种选项中
有合理的就输出 没合理的直接跳过这行字符串
重点分析 :
1. 存储合理的选项 st1, st2;
2. 记录字母存放参数的ans
注意 :
模拟题细节挺多的
1. 使用sstream 前 getchar(); // 除去输入n后边的换行
2. 学习sstream语法
3. 字符串与数值间的转化
4. 对于有参的选项 处理时要i++;
5. 做新的输入时要把ans清空
6. 对于printf(“%s”,string) 会出现乱码 解决办法 使用s的首地址:printf(“%s”,s.c_str()
大模拟
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <sstream>
using namespace std;
const int N = 30;
bool st1[N], st2[N]; // st1 存放的是无参数选项 st2 存放的是有参数选项
string ans[N]; // 该字母后存放的参数
int n;
int main()
{
string str;
cin >> str;
// 处理第一行的数据 进行标注(之后存在这个点才会输出)
for (int i = 0; i < str.size(); i ++)
{
if (str[i+1] == ':' && i + 1 < str.size()) {
st2[str[i] - 'a'] = true;
i ++; // 注意
}
else st1[str[i] - 'a'] = true;
}
cin >> n;
getchar(); // 除去输入n后边的换行 注意
for (int C = 1; C <= n; C ++)
{
printf("Case %d:", C);
//注意
getline(cin,str);
stringstream ssin(str);
vector<string> ops;
while (ssin >> str) ops.push_back(str);
for (int i = 0; i < 26; i ++) ans[i].clear();//注意
for (int i = 1; i < ops.size(); i ++) // 从1开始做 ls不用管
{
//不满足条件break
if (ops[i][0] != '-' || ops[i][1] < 'a' || ops[i][1] > 'z' || ops[i].size() != 2) break;
int k = ops[i][1] - 'a';
if (st1[k]) ans[k] = '/';
else if(st2[k] && i + 1 < ops.size()) ans[k] = ops[i+1], i ++; // 注意
else break;
}
for (int i = 0; i < 26; i ++)
{
if (ans[i].size())
{
cout << " -" << char (i + 'a'); //注意
if (st2[i]) cout << " " << ans[i];
}
}
cout << endl;
}
return 0;
}