#include using namespace std; // https://www.cnblogs.com/meelo/archive/2004/01/13/7706352.html int main() { //输入+输出重定向 freopen("../1351.in", "r", stdin); freopen("../1351.out", "w", stdout); /* //在内部声明两个不同类型的数组,测试一下是不是没有初始化时,它们是不是脏的。 //结果表明,int的是脏的,string的不同,是空字符串 int dirty_type[26]; string dirty_argument[26]; */ // 如果不明确指出初始化列表,那么基本类型是不会被初始化的(除全局变量和静态变量外),所有的内存都是“脏的”; // 0:不存在 1:无参数选项 2:有参数选项 int type[26]; //做为函数外的全局变量,它是默认有初始值的,因为是整数数组,所以默认值是0 //规则 string patten; cin >> patten; for (int i = 0; i < patten.length(); i++) { int last_arg; //这个没有初始化的变量,一直都是52,没想明白为什么 if (patten[i] == ':') { type[last_arg] = 2; //修改:前面的参数符号,记录它是2类型,即有参数选项 } else { last_arg = patten[i] - 'a';//换算为索引位置,记录到映射的数组中,标识为1.就是一个桶排的思路,26个字母,人人有份。 type[last_arg] = 1; } } //输入N行 int n; cin >> n; //因为下面要使用getline,所以这个cin.ignore很重要 // cin.ignore()的用法 // https://blog.csdn.net/wxbmelisky/article/details/48596881 cin.ignore(); //其实就是为了吃掉最后的那个换行符 //开始每一行 for (int i = 1; i <= n; i++) { //每个字符的参数值,下标映射着字符的位置,比如 a:0 b:1 ... string argument[26] = {""}; //读取每一行到字符串temp中 string temp; getline(cin, temp); //上面的cin.ignore()就是为它服务的 stringstream ss(temp); //放过第一个,第一个是命令本体,需要放过 ss >> temp; //按空格分割 while (ss >> temp) { //如果首字母是-,表示是参数标识 if (temp[0] == '-') { int last_arg = temp[1] - 'a'; //换算成选项字母在数组中的位置 if (type[last_arg] == 0) { // 非合法选项,就是没有声明这个选项,结果出来了~ break; //根据题意,就停止这个命令行的判定 } else if (type[last_arg] == 1) { //无参数 argument[last_arg] = " "; } else if (type[last_arg] == 2) { //有参数的,需要读取参数 if (ss.eof()) break; // 后面没有了,就是说有参数,但没有提供参数,是错误的 //读取参数 ss >> temp; argument[last_arg] = temp; } } else { // 非合法参数,因为在上面的判断中,再次使用了ss>>temp,相当于多读取参数的具体值,再出现无-的,就是非法参数了。 break; } } //输出 cout << "Case " << i << ":"; for (int j = 0; j < 26; j++) { //按字母序输出 //因为argument是26个字母都标注的,其实只有内容不是空的,才表示需要输出 if (argument[j] == "")continue; //无参数 if (type[j] == 1) { cout << " -" << char(j + 'a'); } else //有参数 if (type[j] == 2) { cout << " -" << char(j + 'a') << ' ' << argument[j]; } } cout << endl; } //关闭文件 fclose(stdin); fclose(stdout); return 0; }