用指针将输入的四个字符串按长度升序排序
#include<stdio.h>
#include<string.h>
#define M 5
#define N 20
void StrSort(char (*p)[N],int n)
{
int i,j,k,x[n]; char t[N];
for(i=0; i<n; i++ )
x[i]=strlen(p[i]);
for(i=0; i<n-1; i++ )
{ k=i;
for(j=i+1; j<n; j++ )
if(x[j]<x[i]) k=j;
if(k!=i)
{ strcpy(t,p[i]);
strcpy(p[i],p[k]);
strcpy(p[k],t);
x[k]=x[i];
}
}
}
int main()
{
char p[M][N];
int i;
for(i=0;i<M;i++)
gets(p[i]);
StrSort(p,4);
for(i=0;i<M;i++)
puts(p[i]);
return 0;
}
输入A↵B↵AA↵BB↵ 输出的为A↵B↵AA↵BB
如果设计的子函数不包括后面的int n 即子函数如下图
那么假设输入A↵B↵AA↵BB↵ 输出的为B↵A↵BB↵AA↵
这是为什么呢?加上int n之后有什么区别吗?A与B的字符大小都为1,正确的话要怎么排序呢?
有一个逻辑错误。当x[j] < x[i]时,需要交换x[i]和[x[j]。更正了,看下面代码和运行结果。
另外题目要求4各串。可以把M值改为4.
#include<stdio.h>
#include<string.h>
#define M 5
#define N 20
void StrSort(char (*p)[N],int n)
{
int i,j,k,x[n];
char t[N];
for(i=0; i<n; i++ )
x[i]=strlen(p[i]);
for(i=0; i<n-1; i++ )
{
for(j=i+1; j<n; j++ )
if(x[j] < x[i])
{ // 交换 p[i]和p[j],x[i]和x[j]
strcpy(t,p[i]);
strcpy(p[i],p[j]);
strcpy(p[j],t);
k = x[i];
x[i] = x[j];
x[j] = k;
}
}
}
int main()
{
char p[M][N];
int i;
printf("请输入%d个字符串,每行一个:\n", M);
for(i=0;i<M;i++)
{
fgets(p[i], N, stdin);
p[i][strlen(p[i]) - 1] = '\0'; // 去掉行结束符
}
StrSort(p,M);
printf("长度升序排序后的字符串:\n");
for(i=0;i<M;i++)
puts(p[i]);
return 0;
}
// Output
请输入5个字符串,每行一个:
AAAAAAAAAAAAAAAAA
B
CCCCCC
DDD
EEEEEEEEEEEEE
长度升序排序后的字符串:
B
DDD
CCCCCC
EEEEEEEEEEEEE
AAAAAAAAAAAAAAAAA