C语言指针数组应用求解

我采用了冒泡排序为什么只能交换邻近的两组数组,各位能帮我看看吗。
编写一个函数,利用指针将输入的多个字符串按长度升序排序

void StrSort(char *p[N],int n)

【输入形式】

循环输入四个字符串。每输入完一个按回车。

【输出形式】

输出排序后的四个字符串。
【样例输入】

HU

KOBE

BRYANT

CCZU
【样例输出】

HU

KOBE

CCZU

BRYANT

#include <stdio.h>
#include <string.h>

#define N 4
void StrSort(char *p[N],int n)
{
    int num[4],i,j ;
    char t[100];
    for(i = 0; i< 4 ; i++)
    {
        num[i] = strlen(p[i]);    
    } 
    for(i = 0 ; i<3;i++)
    {
        for(j = 0 ; j<3-i ;j++)
        {
            if(num[j] >num[j+1] )
            {
                strcpy(t , p[j]);
                strcpy(p[j] , p[j+1]);
                strcpy(p[j+1] , t);
            }
        }
    }
    
}

int main(void)
{
    
    char a[100], b[100] ,c[100], d[100];
    char *str[4] = {a,b,c,d};
    int i;
    
    for( i = 0 ; i < 4; i++) gets(str[i]);
    putchar('\n');
    StrSort(str, 0);
    
    for( i= 0 ; i<4 ; i++)
    {
        puts(str[i]);
    }
    return 0;
}

给你改了一下,你看排序那里就懂了

img

#pragma warning(disable:4996)
#include <stdio.h>
#include <string.h>

#define N 4
void StrSort(char* p[N], int n)
{
    int num[4], i, j,temp;
    char t[100];
    for (i = 0; i < 4; i++)
    {
        num[i] = strlen(p[i]);
    }
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 3 - i; j++)
        {
            if (num[j] > num[j + 1])
            {
                strcpy(t, p[j]);
                strcpy(p[j], p[j + 1]);
                strcpy(p[j + 1], t);
                temp = num[j];
                num[j] = num[j+1];
                num[j+1] = temp;
            }
        }
    }

}

int main(void)
{

    char a[100], b[100], c[100], d[100];
    char* str[4] = { a,b,c,d };
    int i;

    for (i = 0; i < 4; i++) gets(str[i]);
    putchar('\n');
    StrSort(str, 0);

    for (i = 0; i < 4; i++)
    {
        puts(str[i]);
    }
    return 0;
}


望采纳,谢谢!