C语言 指针问题 求大佬帮忙看看代码哪出问题了

用指针将输入的四个字符串按长度升序排序

#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