1. 程式人生 > >ccf--20140303--命令行選項

ccf--20140303--命令行選項

小寫字母 否則 emd enter include getline 命令行選項 tor esp

本題是常規思路,這裏要註意:
1)帶參命令沒有參數和參數錯誤時終止
2)命令不存在時終止
3)命令都是錯誤的,不以—開頭。

題目和代碼如下:

問題描述

試題編號: 201403-3
試題名稱: 命令行選項
時間限制: 1.0s
內存限制: 256.0MB
問題描述: 問題描述   請你寫一個命令行分析程序,用以分析給定的命令行裏包含哪些選項。每個命令行由若幹個字符串組成,它們之間恰好由一個空格分隔。這些字符串中的第一個為該命令行工具的名字,由小寫字母組成,你的程序不用對它進行處理。在工具名字之後可能會包含若幹選項,然後可能會包含一 些不是選項的參數。
  選項有兩類:帶參數的選項和不帶參數的選項。一個合法的無參數選項的形式是一個減號後面跟單個小寫字母,如"-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
#include<bits/stdc++.h>
using namespace std;
int main(){
	string cmd="";
	cin>>cmd;
	int n;
	cin>>n;
	cin.ignore();
	for(int i=0;i<n;i++){
		map<string,string> mmps;
		//int flag=0;
		string temps="";
		getline(cin,temps);
		stringstream ss(temps);
		string ml;
		ss>>ml;//忽略掉開頭的命令名稱 
		while(ss>>ml){
			if(ml[0]!=‘-‘)
				break;
			string temp_ml=ml.substr(1,ml.length()-1);
			//cout<<"temp_ml:"<<temp_ml<<endl;
			if(cmd.find(temp_ml)!=string::npos){
				int index=cmd.find(temp_ml);
				if((index<cmd.length()-1)&&cmd[index+1]==‘:‘){
					string canshu="";
					if(ss.eof()){
						break;
					}
					ss>>canshu;
					int flag=0;
					for(int j=0;j<canshu.length();j++){
						if(!(canshu[j]>=‘0‘&&canshu[j]<=‘9‘||canshu[j]==‘-‘||(canshu[j]>=‘a‘&&canshu[j]<=‘z‘))){
							flag=1;
							break;
						}
					}
					if(canshu=="")
						flag=1; 
					if(flag==0)
						mmps[ml]=canshu;
					else
						break;
				}else{
					mmps[ml]="";
				}
			}else{
				//flag=1;
				break;
			}	
		}
		cout<<"Case "<<i+1<<": ";
		map<string,string>::iterator it;
		for(it=mmps.begin();it!=mmps.end();it++){
			cout<<it->first<<" ";
			if(it->second!=""){
				cout<<it->second<<" ";
			}
		}
		cout<<endl;
	}
	return 0;
}

  

ccf--20140303--命令行選項