设允许输入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;
}
运行样例如下:
#include < stdio.h >
#include < string.h >
#define SIZE 3 /*字符串数量*/
#define MAX 30 /*字符串长度*/
char input[SIZE][MAX]={0};
void sort(char str[][MAX],int size)
{
/* 对size个字符串按长度用冒泡法进行升序排序
* 长度相同则按字母升序排序
* MAX-字符串最大长度
*/
int counter1,counter2;
char temp[MAX];
for(counter1=0;counter1for(counter2=0;counter2 {
/*如果字符串str[counter2]长度大于它后面的字符串*/
if(strlen((char *)(str[counter2]))>strlen((char *)
(str[counter2+1])))
{
/*将字符串str[counter2]与它后面的字符串换个位置*/
strcpy(temp,(char *)(str[counter2+1]));
strcpy((char *)(str[counter2+1]),
(char *)(str[counter2]));
strcpy((char *)(str[counter2]),temp);
}
/* 如果字符串str[counter2]长度等于它后面的字符串 且
* 字符串str[counter2]按字母排序大于它后面的字符
*/
if(strlen((char *)(str[counter2]))==strlen((char *)
(str[counter2+1])) &&
strcmp((char *)(str[counter2]),
(char *)(str[counter2+1]))>0)
{
/*将字符串str[counter2]与它后面的字符串换个位置*/
strcpy(temp,(char *)(str[counter2+1]));
strcpy((char *)(str[counter2+1]),
(char *)(str[counter2]));
strcpy((char *)(str[counter2]),temp);
}
}
}
int main( )
{
int counter =0;
/*输入字符串*/
while(counter{
printf("请输入第%d个字符串(共%d个):",counter+1,SIZE);
scanf("%s",input+counter);
++counter;
}
/*排序*/
sort(input,SIZE);
/*输出排序后的字符串*/
printf("\n排序后的字符串\n");
counter=0;
while(counter{
printf("第%d个字符串:%s\n",counter+1,input+counter);
++counter;
}
return 0 ;
}
/*供你参考*/