命令行选项
问题描述
请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,不含任何其他符号。在工具名字之后可能会包含若干选项(以减号”-”开头的字符串),还可能包含一些不是选项的参数(不以减号“-”开头的字符串)。
请写一个程序分析给出的命令行,输出命令行包含的不重复选项(即,重复的选项只输出一次)。
输入格式
输入是一个待处理的命令行,长度不超过 255 个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。
输出格式
按照字母升序输出该命令行中用到的所有选项的名称,如果一个选项在命令行中出现了多次,只输出一次,如果命令行不包含任何选项,则输出no。
样例输入1
ls -a -l -a documents -b
样例输出1
-a -b -l
样例输入2
ls
样例输出2
no
样例输入
ls -w 10 -x -w 15
样例输出
-w -x
一些思考:个人认为这题很坑,我就是卡在“如何剔除重复”上面了
以下是老师给的参考代码。
剔除重复这一部分用了排序。。。唉,样例并不完整,我并不能知道这些选项要按照原来顺序输出还是可以不按照原顺序输出
前面的字符串处理非常重要,好几道题都是这个思路
参考代码利用i,j,k三个变量处理了一下
另外 如果二维数组 str[i][j] 调用是记作str[i]时 则代表这一整行(看来跟指针是一样的-_-|| 我太菜了QAQ)
#include<stdio.h>
#include<string.h>
int main()
{
char string[256];
char str[100][20];
int i,j,k,n,flag=0;
gets(string);
j=0;
for(i=0;string[i]!='\0';i++)
{
if(string[i]=='-')
{
flag=1;//标记命令存在,所以不是no
for(k=0;string[i]!=' '&&string[i]!='\0';i++,k++)
str[j][k]=string[i];
str[j][k]='\0'; //二维数组来存字符串的一行 最后以\0结束
j++;//j控制行标 k控制列标 而i为原字符串的索引
}
if(string[i]=='\0') break;//好像没意义
}
n=j;//此时的j为行数,也就是带“-”的命令符的数量
if(flag)//如果存在命令 ,改进:直接判断n是否为0即可
{
for(i=0;i<n-1;i++)//选择排序 ,string多次重复利用
{
k=i;
for(j=i+1;j<n;j++)
if(strcmp(str[k],str[j])>0) k=j;
if(k!=i)
{
strcpy(string,str[i]);
strcpy(str[i],str[k]);
strcpy(str[k],string);
}
}
strcpy(string,str[0]);
printf("%s",string);
for(i=1;i<n;i++)
{
if(strcmp(string,str[i])!=0)
{
strcpy(string,str[i]);
printf(" %s",string);
}
}
}
else printf("no");
return 0;
}