程序很简单,关键是参数中的|是SH的一个操作符号(管道),所以要在参数上加上双引号,即:
bao "|333|1|222|55555|4444|"
程序如下:
//---------------------------------------------------------------------------
#include
#include
#include
char **spt(char *s,int *j)
{
char **rt=malloc(sizeof(char *));
int i;
for (i = 0; s[i]; i++) {
if (!i&&s[i]||i&&s[i-1]=='|') {
rt[(*j)++]=&s[i];
rt=realloc(rt,sizeof(char *)*((*j)+1));
if (i) s[i-1]='\0';
}
}
return rt;
}
int cmp1(const void *a,const void *b)
{
int lx=strlen((const char *)a)-strlen((const char *)b);
return lx?lx:strcmp((const char *)a,(const char *)b);
}
int cmp2(const void *a,const void *b)
{
int lx=strcmp((const char *)a,(const char *)b);
return lx?lx:strlen((const char *)a)-strlen((const char *)a);
}
int main(int argc, char* argv[])
{
char **ss=NULL;
char *a=NULL;
int i,n=0;
if (argc>1) {
a=malloc(sizeof(char)*(strlen(argv[1])+1));
strcpy(a,argv[1]);
ss=spt(a,&n);
qsort(ss,n,sizeof(char *),cmp1); /*如果这里用cmp1则排序依据字符串长度优先,如果是用cmp2则依据字符串的strcmp()比较结果优先*/
for (i = 0; i
}
}
return 0;
}
//---------------------------------------------------------------------------
你这个不涉及内核的C语言程序和Linux有何关系……
具体见main函数带的两个参数的使用:
int argc, char *argv
别听楼上胡说八道,前两天刚有个人问了同样的问题,都是很糟糕的提问,因为竖线符号【|】是管道符号,你运行命令bao |333|1|222|55555|4444,相当于运行了【bao】【333】【1】【222】【5555】【4444】一共六个程序,根本不是你想象的命令行!