dossort.c

来自「国外网站上的一些精典的C程序」· C语言 代码 · 共 121 行

C
121
字号
/*    cl /AL sortit.c===========================================================   sort.c       7-31-91  Robert Mashlan   This filter is almost compatible with the MS-DOS filter of the same name.   This filter sorts each line of standard input, disregarding case,   and sends it to standard output.   optional parameters:  /R    Output in reverse order                         /+n   Compare at column n, 1 based   example usage:  sort < unsorted.txt > sorted.txt   note: compile in a far data model for maximum capacity ( compact or large )*/#include <stdlib.h>#include <stdio.h>#include <string.h>#define MAXLINES 10000        /* maximum number of lines to sort */#define MAXLINE  80           /* maximum line length             */unsigned col     = 0;  /* column to start sort at ( zero based here ) */int      reverse = 0;  /* reverse order flag                          *//***  compare function for qsort*/int cmp( const void *a, const void *b){      int result;      const char *_a = *(const char **)a;      const char *_b = *(const char **)b;      /* compare at col if other than zero */      if (col > 0)      {            if (strlen(_a) > col)                  _a += col;            else  _a = "";            if (strlen(_b) > col)                  _b += col;            else  _b = "";      }      result = stricmp(_a,_b);      return reverse ? -result : result;}int main(int argc, char *argv[]){      static char *lines[MAXLINES];      int i, nlines=0, no_match;      char buf[MAXLINE];      /* scan for command line options */      for(i=1;i<argc;i++)      {            if(!stricmp(argv[i],"/R"))  /* reverse order option */                  reverse=1;            else if (!strnicmp(argv[i],"/+",2))  /* column number option */            {                  int n = atoi(argv[i]+1)-1;                  if (n < 0)                        n = 0;                  col = (unsigned)n;            }            else            {                  fputs("Invalid Parameter",stderr);                  return 1;            }      }      while(1)      {            /* read the line */            if(fgets(buf,MAXLINE,stdin)==NULL)                  break;            /* Check for duplicates here */            no_match = 1;            for ( i=0; i< nlines; i++ )            {                  if (0 == (no_match = memicmp(buf, lines[i],                        (unsigned int)12)))                  {                        break;                  }            }            if (no_match)                 /* make a duplicate on the heap */            {                  if((lines[nlines++]=strdup(buf))==NULL)                  {                        fputs("SORT: Insufficient memory",stderr);                        return 2;                  }            }      }      /* sort the lot */            qsort((void *)lines,nlines,sizeof(char *),cmp);      /* display the sorted output */            for (i=0;i<nlines;i++)            fputs(lines[i],stdout); /* send it to standard output */      return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?