活生生的九月☜ 因恨葬心
关注数: 82 粉丝数: 76 发帖数: 1,106 关注贴吧数: 26
命令行选项这题,测评结果是运行错误,只有90分,出错在哪了? #include<iostream> #include<string> #include<algorithm> using namespace std; int main() { int N,flag,len,g=0; string format,t; //格式字符串format只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头 getline(cin,format); cin>>N; cin.get(); string order[N],str[N],str2[N][100]; string::iterator p,q; for(int i=0;i<N;i++) { getline(cin,order[i]); } for(int i=0;i<N;i++) { int j=0; for(q=order[i].begin(),flag=0;q!=order[i].end();q++,j++)//j表示迭代器q指向string类字符串order[i]的下标 { if(*q==' ')//跳过第一个代表名字的字符串 { flag++; } if(flag>=1&&*q!=' ') { t=*(q+1);//t是string类,可以直接加字符串 if(*q=='-'&&*(q+2)==' '&&format.find(t+':')!=-1)//有参选项的情况 { if(str[i].find(*(q+1))==-1) { str[i]+=*(q+1);//str[i]存放一行的带参和不带参选项的字母 } q+=3; j+=3; len=3;//len表示要存放选项和其参数的长度 while(*q!=' '&&*q!='\0') { q++; j++; len++; } str2[i][g++]=order[i].substr(j-len+1,len);//str2[i][]存放带参选项和其参数,中间空格隔开 } else if(*q=='-'&&(*(q+2)==' '||*(q+2)=='\0')&&format.find(*(q+1))!=-1)//无参选项的情况 { if(str[i].find(*(q+1))==-1) { str[i]+=*(q+1); } q++; j++; } else//不是某个合法选项的参数时,分析就停止 { break; } } } } for(int i=0;i<N;i++) { sort(str[i].begin(),str[i].end());//把每行带参和不带参的选项字母排序 } for(int i=0;i<N;i++) { cout<<"Case "<<i+1<<": "; for(p=str[i].begin();p!=str[i].end();p++) { int j; for(j=g-1;j>=0;j--) //由于一个带参数的选项在命令行中出现了多次,只输出最后一次出现时所带的参数,所以从str2[i][]数组的尾开始循环 { q=str2[i][j].begin(); if(*q==*p) { cout<<'-'<<str2[i][j]<<' '; break; } } if(j<0)//j<0说明不是带参的选项 { cout<<'-'<<*p<<' '; } } cout<<endl; } return 0; }
1 下一页