按字符串长度排序可以分为以下三个步骤:

  1. 读取所有输入行

  2. 对文本进行排序

  3. 按次序打印文本行

代码如下:

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define MAXLEN 1000
char *alloc(int);
int getline(char *p,int n);//读取一行字符
int readline(char *lineptr[],int maxlines);//读取所有输入行
void qsort(char *lineptr[],int left,int right);//对字符串进行排序
void writeline(char *lineptr[],int lines);//打印
void swap(char *lineptr[],int i,int j);//交换指针
int main()
{
    char *p[100];
    int i;
    i = readline(p,100);

    //swap(p,0,1);
    qsort(p,0,i-1);
    writeline(p,i);
    //printf("%s",p[1]);
    printf("%d\n",i);   
    return 0;
} 
int getline(char s[],int n)
{
    int i;
    int c;
    for(i=0;i<n-1&&(c=getchar())!='\n'&&c!=EOF;i++)
        s[i]=c;
    if(c=='\n')
    {
        s[i]=c;
        i++;
    }
    s[i] ='\0'; 
    return  i;
}
int readline(char *lineptr[],int maxlines)
{
    int len,nlines;
    char *p;
    char line[MAXLEN];
    nlines = 0;
    while((len = getline(line,MAXLEN)) >0 )
        if(nlines >= maxlines || (p = (char*)malloc(len)) == NULL)  //p=alloc[len]ÉêÇëÄÚ´æ¿Õ¼ä 
            return -1;
        else
        {
            line[len-1]='\0';       //ɾ³ýÁË»»Ðзû
            strcpy(p,line);
            lineptr[nlines++] = p;
        }
    return nlines;  
}

void writeline(char *lineptr[],int lines)
{
    int i=0;
    for(i=0;i<lines;i++)
        printf("%s\n",lineptr[i]);
}

void qsort(char *lineptr[],int left,int right)
{

    int i,last; 
    if(left>=right)
        return ;
    swap(lineptr,left,(left+right)/2);
    last = left;
    for(i=left+1;i<=right;i++)
        //if(strcmp(lineptr[i],lineptr[left])<0) 
        if(strlen(lineptr[i])<strlen(lineptr[left]))//比较字符串长度
            swap(lineptr,++last,i);

    swap(lineptr,left,last);
    qsort(lineptr,left,last-1);
    qsort(lineptr,last+1,right);
}
void swap(char *lineptr[],int i,int j)
{
    char *temp;
    temp = lineptr[i];
    lineptr[i]=lineptr[j];
    lineptr[j] = temp;
}

运行结果: