77kki 2021-05-25 23:11 采纳率: 60%
浏览 27
已采纳

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,正确的话要怎么排序呢?

  • 写回答

1条回答 默认 最新

  • benbenli 2021-05-25 23:55
    关注

    有一个逻辑错误。当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
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?