201403 3命令列選項(60分待完善)

2021-08-27 14:08:18 字數 2571 閱讀 5268

問題描述

請你寫乙個命令列分析程式,用以分析給定的命令列裡包含哪些選項。每個命令列由若干個字串組成,它們之間恰好由乙個空格分隔。這些字串中的第乙個為該命令列工具的名字,由小寫字母組成,你的程式不用對它進行處理。在工具名字之後可能會包含若干選項,然後可能會包含一 些不是選項的引數。

選項有兩類:帶引數的選項和不帶引數的選項。乙個合法的無引數選項的形式是乙個減號後面跟單個小寫字母,如」-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

#includeusing namespace std;

bool judge1(string str,int x)//判斷合法選項

return flag;

}bool judge2(string str)//判斷合法引數:小寫字母,數字和減號組成的非空字串

}if(len==2&&str[0]=='-'&&(str[1]>='a'&&str[1]<='z')) flag=false;

return flag;

}struct num

}; //tips:字串初始化一定程度上可簡化**

int main()

;//字母中是1否0是選項 有引數2

string str;cin>>str;

int len=str.length();

for(int i=0;(i+1)if(str[i]>='a'&&str[i]<='z'&&str[i+1]==':')

else

if(str[i]>='a'&&str[i]<='z'&&str[i+1]!=':')

}if(str[len-1]!=':')

int n;cin>>n;

cin.get();

for(int i=1;i<=n;i++)

cnt--;

string deal[cnt];//分離待處理的選項

int stop=2;

for(int k=0;kint step1=-1,step2=-1;

for(int j=stop;jif(str[j]==' '&&step1==-1&&step2==-1)

else

if(str[j]==' '&&step1!=-1&&step2==-1)

}deal[k]=str.substr(step1+1,step2-step1-1);

}num number[26]; //按字母公升降順序輸出

int flag2[26]=;//選項是否出現過

for(int k=0;kif(judge1(deal[k],flag1))

else

if(flag1[deal[k][1]-'a']==1&&flag2[deal[k][1]-'a']==1)

else

if(flag1[deal[k][1]-'a']==2)

else

if(k==(cnt-1))

else

break; } }

else

break;

}for(int k=0;k<26;k++)

CCF CSP 命令列選項(201403 3)

問題描述 請你寫乙個命令列分析程式,用以分析給定的命令列裡包含哪些選項。每個命令列由若干個字串組成,它們之間恰好由乙個空格分隔。這些字串中的第乙個為該命令列工具的名字,由小寫字母組成,你的程式不用對它進行處理。在工具名字之後可能會包含若干選項,然後可能會包含一 些不是選項的引數。選項有兩類 帶引數的...

201403 3 命令列選項 模擬

請你寫乙個命令列分析程式,用以分析給定的命令列裡包含哪些選項。每個命令列由若干個字串組成,它們之間恰好由乙個空格分隔。這些字串中的第乙個為該命令列工具的名字,由小寫字母組成,你的程式不用對它進行處理。在工具名字之後可能會包含若干選項,然後可能會包含一些不是選項的引數。選項有兩類 帶引數的選項和不帶引...

CCF2014 03 3命令列選項

問題描述 請你寫乙個命令列分析程式,用以分析給定的命令列裡包含哪些選項。每個命令列由若干個字串組成,它們之間恰好由乙個空格分隔。這些字串中的第乙個為該命令列工具的名字,由小寫字母組成,你的程式不用對它進行處理。在工具名字之後可能會包含若干選項,然後可能會包含一 些不是選項的引數。選項有兩類 帶引數的...