问题描述
请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。
选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-a" 或"-b"。而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。
该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。例如, "ab:m:" 表示该程序接受三种选项,即"-a"(不带参数),"-b"(带参数), 以及"-m"(带参数)。
命令行工具的作者准备了若干条命令行用以测试你的程序。对于每个命令行,你的工具应当一直向后分析。当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。
输入格式
输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。
输入的第二行是一个正整数 N(1 ≤ N ≤ 20),表示你需要处理的命令行的个数。
接下来有 N 行,每行是一个待处理的命令行,它包括不超过 256 个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。
输出格式
输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。
样例输入
albw:x
4
ls -a -l -a documents -b
ls
ls -w 10 -x -w 15
ls -a -b -c -d -e -l
样例输出
Case 1: -a -l
Case 2:
Case 3: -w 15 -x
Case 4: -a -b
这道题我用C干模逆写了很久。。可以说是非常恶心了,结果呢!超时。。。。
ohmygod。。。
使用C++ map就很简单
特别罗列在写的时候需要注意的地方
1:首先是map这个工具 在map中将字符作为索引而不是int类型的数作为索引。
每个字符对应相应的int进行有参数和无参数的区别
2:C++中 cin>>get()的使用,防止读入换行
getline(cin,s),可以读入带有空格的字符串;
3:string库中find()函数的使用,查找到s.find(' ')空格区分每个命令,找不到返回-1
4:string库中substr的使用。s.substr(i,j),划分字符串,从i开始长度为j
5:最后是map的遍历方法:map::iterator it=para.begin();it!=para.end()
it是一个指针,依次指向map中的一项
(*it).first为第一项,(*it).second为第二项
#include #include #include using namespace std; map type; map para; string s,s1,s2; int main() { bool flag; cin>>s; for(int i=0;i>n; cin.get();//注意避免读入换行符 for(int i=0;i>s; getline(cin,s);//C++读入带有空格的字符串 while((p1=s.find(' '))!=-1) { s[p1]=0; p2=s.find(' '); if(p2==-1) p2=s.length(); s2=s.substr(p1+1,p2-p1-1); if(!flag) { if(s2[0]!='-'||!type[s2[1]]) break; if(type[s2[1]]==2) para[s2[1]]="*"; else { s1=s2; flag=1; } } else { para[s1[1]]=s2; flag=0; } } cout<::iterator it=para.begin();it!=para.end();it++) { cout<