题目4:命令行选项
问题描述
请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。
每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,不含任何其他符号。在工具名字之后可能会包含若干选项(以减号”-”开头的字符串),还可能包含一些不是选项的参数(不以减号“-”开头的字符串)。
请写一个程序分析给出的命令行,输出命令行中不重复选项(即,重复的选项只输出一次)。
输入格式
输入是一个待处理的命令行,长度不超过 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
——————————————————————————————
局限性是命令行选项不能为:减号+一传英文字母
解决详见——练习:命令行选项(优化版)
#include<stdio.h>
//因为要完成的目的是获取所有的命令行选项且不用对其他任何字符进行处理。
//所以遇到其他字符跳过即可。
//若不同命令行工具中选项一致的情况,依然需要剔除,只考虑选项是否一致,不考虑其归属问题
int main()
{
int i,j,w,m;
char a[256]={0},b[256]={0},c[256]={0};//a用来接收命令行,b用来接受命令行选项并剔除,c用来排序并输出
gets(a);
for(i=0,w=0;a[i]!='\0';i++)//可直接用'\0'作为判断条件 ,也可用strlen(a)来写
{
if(a[i]=='-')//此代码默认命令选项是由减号和单个字母构成的,有一定局限性
{
b[w]=a[i+1];
w++;
}
}
//若先进行剔除重复内容的操作,则最先出现的不做处理,之后的重复内容置0(ASCII码值为0,即空字符NULL即'\0')
if(w)//判断是否有选项,此时w可代表有几个命令行选项
{
for(i=0;i<w;i++)
{
for(j=1;i+j<w;j++)
{
if(b[i+j]==b[i])
{
b[i+j]=0;
}
}
}
for(i=0,j=0,m=0;i<w;i++)
{
if(b[i])//排除刚才置0的元素
{
c[j]=b[i];
m++;//m用来统计最终的选项个数,方便接下来的排序操作
j++;//为下一次赋值做准备
}
}
for(i=0;i<m-1;i++)//冒泡排序
{
for(char t='0',j=0;j<m-i-1;j++)
{
if(c[j]>c[j+1])
{
t=c[j];c[j]=c[j+1];c[j+1]=t;
}
}
}
for(i=0;i<m;i++)
{
printf("-%c ",c[i]);
}
}
else printf("no");
return 0;
}