输入有限个字符串,先按字符串长度排序,若长度一样,再按字母顺序排序,并将其输出
推荐于2018-03-29 · 知道合伙人互联网行家
设允许输入10个字符串,长度限制为50个字符以内,用char型二维数组记载。另声明一个10个元素的char *型指针数组,使每个元素对应指向前述每个字符串,排序时只交换指针而不拷贝字符串。代码如下:
#include "stdio.h"
#include "string.h"
int main(int argc,char *argv[]){
char s[10][51],*ps[10]={s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7],s[8],s[9]},*p;
int i,j,k,t;
printf("Input 10 strings...\n");
for(i=0;i<10;scanf("%50s",s[i++]));//输入10个字符串
for(i=0;i<10;i++){//选择排序
for(k=i,j=k+1;j<10;j++)
//下一句按长度或等长时大小判断
if((t=strlen(ps[k])-strlen(ps[j]))>0 || (t==0 && strcmp(ps[k],ps[j])>0))
k=j;
if(k-i)
p=ps[k],ps[k]=ps[i],ps[i]=p;//只交换指针
printf("%s\n",ps[i]);//输出
}
return 0;
}
运行样例如下:
楼主用的什么语言?
C语言
看到了采纳答案。
觉得,有些繁杂,实际上,用不着倒腾各字符串的内容。
建立一个索引,即可。
//参考下列程序:
void main(void)
{
char a[7][80] = { //内定字符串
{"0_Sunday"}, {"1_Monday"}, {"2_Tuesday"},
{"3_Wednesday"}, {"4_Thursday"}, {"5_Friday"},
{"6_Saturday"}};
char b[7] = {0, 1, 2, 3, 4, 5, 6}; //索引表
char *p1, *p2;
char i, j, k, l1, l2, t;
//-------冒泡法排序
for (i = 0; i < 6; i++)
for (j = 0; j < (7 - i - 1); j++) {
p1 = a[b[j]]; l1 = strlen(p1); //取长度
p2 = a[b[j + 1]]; l2 = strlen(p2);
if (l1 < l2) //长度不同
{t = b[j]; b[j] = b[j + 1]; b[j + 1] = t;} //交换
else if (l1 == l2) //长度相同
for (k = 0; k < l1; k++) //逐个字符比较
if (*(p1 + k) < *(p2 + k))
{t = b[j]; b[j] = b[j + 1]; b[j + 1] = t; break;}
}
//-------//排序结束
printf("after sort: \n"); //排序后
for (i = 0; i < 7; i++)
printf("%s\n", a[b[i]]);//显示各个串
}
本程序执行后,显示:
after sort:
3_Wednesday
6_Saturday
4_Thursday
2_Tuesday
5_Friday
1_Monday
0_Sunday