CCF——命令行選項

題目:

問題描述
  請你寫一個命令行分析程序,用以分析給定的命令行裏包含哪些選項。每個命令行由若干個字符串組成,它們之間恰好由一個空格分隔。這些字符串中的第一個爲該命令行工具的名字,由小寫字母組成,你的程序不用對它進行處理。在工具名字之後可能會包含若干選項,然後可能會包含一 些不是選項的參數。
  選項有兩類:帶參數的選項和不帶參數的選項。一個合法的無參數選項的形式是一個減號後面跟單個小寫字母,如"-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


題目來源:CCF--命令行選項


思路:

     模擬。

     我卡在這種測試數據:

                              albw:x
         1
         ls -w 10 -x -w


           


#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#define MAX 207
using namespace std;
typedef long long ll; 
map<string,string> mp;
int main(){
    string format;
    cin>>format;
    int n;
    cin>>n;
    getchar();
    for(int t=0;t<n;++t){
    	string s;
    	getline(cin,s);
    	int p=0,len=s.length();
    	mp.clear();
    	while(p<len && s[p]!=' ')p++;
    	p++;
    	while(p<len){
    		string op="",ag="";   //op代表操作,ag代表參數
			//從輸入中截取操作串 
    		while(p<len && s[p]!=' '){
    			op+=s[p];
    			p++;
    		}
    		p++;
       //由於命令只有兩個字符,並且以'-'開頭 ,如果長度不爲2或者不以'-'開頭都不行,並且命令應在格式串中有說明 
			if(op.length()!=2 || op[0]!='-' || (op[0]=='-' && format.find(op[1])==string::npos))break;
    		//如果帶參數,則要從輸入中獲取參數 
    		if(format.find(op.substr(1,1)+":")!=string::npos){
    		    //如果有參數,但無法獲取則結束;(題目中好像卡了這個數據) 
				if(p>=len)break;
				//截取參數 
				while(p<len && s[p]!=' '){
    			    ag+=s[p];
    			    p++;
    		    }
				p++;    			
    		}
    		mp[op]=ag;
    	}
    	printf("Case %d:",t+1);
    	//輸出需認證考慮,不要帶有多餘的空格 
    	for(map<string,string>::iterator i=mp.begin();i!=mp.end();i++){
    		cout<<" "<<i->first;
			if(i->second != "")cout<<" "<<i->second; 
    	}
    	cout<<endl;
    }
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章