text: #include <stdio.h>
  #include <string.h>
  
  #define MAXLINES 5000
  
  char *lineptr[MAXLINES]; /* 指向文本行的指针数组 */
  
  int readlines(char *lineptr[], int nlines);
  void writelines(char *lineptr[], int nlines);
  
  void qsort(char* lineptr[], int left, int right);
  
  int main(int argc, char *argv[])
  {
    int nlines; /* 读取的输入行数目 */
  
    if ((nlines = readlines(lineptr, MAXLINES)) >= 0)
    {
      qsort(lineptr, 0, nlines - 1);
      writelines(lineptr, nlines);
      return 0;
    }
    else
    {
      printf("error: input too big to sort\n");
      return 1;
    }
  }
  
  #define MAXLEN 1000 /* 每个输入文本行的最大长度 */
  
  int getline(char *, int);
  char *alloc(int);
  
  int readlines(char* lineptr[], int maxlines)
  {
    int len, nlines;
    char* p,line[MAXLEN];
  
    nlines = 0;
    while ((len = getline(line, MAXLEN))>0)
    {
      if (nlines >= maxlines || (p=alloc(len))==NULL)
        return -1;
      else
      {
        line[len-1] = '\0'; /* 删除换行符 */
        strcpy(p, line);
        lineptr[nlines++] = p;
      }
    }
    
    return nlines;
  }
  
  void writelines(char* lineptr[], int nlines)
  {
    int i;
  
    for (i = 0;i<nlines;i++)
      printf("%s\n", lineptr[i]);
  }
  
  void swap(char *[], int, int);
  
  void qsort(char *v[], int left, int right)
  {
    int i, last;
    
    if (left >= right)
      return;
    swap(v, left, (left + right) / 2);
    last = left;
    for (i = left + 1; i <= right;i++)
      if (strcmp(v[i],v[left]) < 0)
        swap(v, ++last, i);
    swap(v, left, last);
    qsort(v, left, last - 1);
    qsort(v, last + 1, right);
  }
  
  void swap(char *v[], int i, int j)
  {
    char *temp;
    temp = v[j];
    v[i] = v[j];
    v[j] = temp;
  }
  
  #define ALLOCSIZE 10000
  
  static char allocbuf[ALLOCSIZE];
  static char *allocp = allocbuf;
  
  char *alloc(int n)
  {
    if (allocbuf + ALLOCSIZE - allocp >= n)
    {
      allocp += n;
      return allocp - n;
    }
    else
    {
      return 0;
    }
  }
  
  void afree(char* p)
  {
    if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
      allocp = p;
  }
  
  int getline(char s[], int lim)
  {
    int c, i;
  
    i = 0;
    for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
      s[i] = c;
    if (c == '\n')
    {
      s[i] = c;
      ++i;
    }
    s[i] = '\0';
  
    return i;
  }
  