优化了命令行选项(简版)中,命令行只能是减号+单个字符的缺陷
#include<stdio.h>
#include<string.h>
//因为处理的对象(命令行选项)可能为一串字母,所以若还要排序,就不能使用一维数组
//(在一维字符数组中不易获取随机长度的字符串(因为每一小节后面均无'\0')。
//即在abcdef中获取不同的字符串"a","bcd""ef"。
//所以需要使用二维数组。
int main()
{
int i,j,k;
char tmp[256]={0},a[200][20]={0};//tmp用来临时存储获取的命令行和字符串。
//a[200][20],因命令行选项个数,长度均未知,所以多申请些空间
gets(tmp);//gets用来字符串的输入,因为是获取字符串,所以会在最后自动添加'\0'
for(i=0,j=0;tmp[i]!='\0';i++)//j表示数组a的行号,也用来对命令行选项的个数进行记录
{
if(tmp[i]=='-')
{
for(k=0;tmp[i]!=' ' &&tmp[i]!='\0';k++,i++)//命令行选项的后面可能是' ',也可能是'\0'
{
a[j][k]=tmp[i];
}
j++;
}
}
int n=j;
if(n)
{
for(i=0;i<n-1;i++)//选择排序
{
for(j=1;i+j<n;j++)
{
if(strcmp(a[i],a[i+j])>0)
{
strcpy(tmp,a[i]);//把a[行号]看成一个一维数组的数组名;strcpy复制时会复制'\0'
strcpy(a[i],a[i+j]);
strcpy(a[i+j],tmp);
}
}
}
strcpy(tmp,a[0]);
printf("%s ",a[0]);
for(i=1;i<n;i++)
{
if(strcmp(tmp,a[i])!=0)//剔除重复的命令行选项
{
printf("%s ",a[i]);
strcpy(tmp,a[i]);
}
}
}
else
printf("no") ;
return 0;
}