快捷搜索:   服务器  安全  linux 安全  MYSQL  dedecms

汉字行编辑程序

    我写了一个汉字行编辑程序,请各位多多指教,找出本程序的不足,以提高本程序的功能,!

    程序如下:

    #include "stdio.h"
    #include "stdlib.h"
    #include "string.h"
    #include "conio.h"
    #define len 4
    #define LINESIZE 80   /*每行长度为80个字符*/
    strUCt TEXT
    {
     struct TEXT *prior;
     char str[LINESIZE+1];  /*包括 '\0' 在内,设置长度为LINESIZE+1*/
     struct TEXT *next;
    };
    struct TEXT *TPTR,*BPTR,*KPTR,*QPTR,*SPTR,*YPTR,*XPTR,*FPTR;
    struct TEXT *ptr,*work;
    int CHG,ERR,CMP,IND,CTR,i,NUM;
    char ch,BUF;
    char IN[LINESIZE+1],NUMD[len],MAT[LINESIZE],REP[LINESIZE],temp[LINESIZE];
    void main()  /*#1 主要起调度作用*/
    {
     void IN99v();
     void READ_LINE();
     void INPUT();
     void TOP();
     void UP();
     void NEXT();
     void ENTER();
     void LIST();
     void DELETE();
     void REPLACE();
     void FIND();
     void INSERT();
     void COPY();
     void STORE();
     void WR99vE_LINE();
     clrscr();
     IN99v();
     while(1)
     {
      if(IND==0)
       printf("\n-");  /*命令提示符*/
      READ_LINE();
      i=0;
      if(IND!=0)
       INPUT();
      else
      {
       ch=IN[0];
       if(ch=='T'ch=='t')
        TOP();
       else if(ch=='U'ch=='u')
        UP();
       else if(ch=='N'ch=='n')
        NEXT();
       else if(ch=='E'ch=='e')
        ENTER();
       else if(ch=='L'ch=='l')
        LIST();
       else if(ch=='D'ch=='d')
        DELETE();
       else if(ch=='R'ch=='r')
        REPLACE();
       else if(ch=='F'ch=='f')
        FIND();
       else if(ch=='I'ch=='i')
        INSERT();
       else if(ch=='C'ch=='c')
        COPY();
       else if(ch=='S'ch=='s')
        STORE();
       else if(ch=='Q'ch=='q')
        exit(0);
       else
       {
        strcpy(IN,"?!\0");  /*不正确的编辑命令响应*/
        WR99vE_LINE();
       }
      }
     }
    }
    void IN99v()  /*#2 初始化正文编辑程序*/
    {
     void WR99vE_LINE();
     printf("\n         ________________________________________");
     printf("\n               program for edit                ");
     printf("\n        T:TOP  U N:UP N N:NEXT                 ");
     printf("\n        E:ENTER L N:LIST D N:DELETE ");
     printf("\n        R /STR1/STR2/ N:REPLACE F /SFTR1/:FIND ");
     printf("\n        C N:COPY   S N:STORE    I:INSERT       ");
     printf("\n        Q:QU99v     -: the sing of order        ");
     printf("\n        -----------------------------------------");
     FPTR=(struct TEXT*)malloc(sizeof(struct TEXT));
     FPTR->prior=0;
     FPTR->next=0;
     CMP=CHG=ERR=0;
     IND=0;
     BPTR=TPTR=0;  /*无正文链*/
     KPTR=QPTR=0;  /*无工作链*/
     strcpy(IN,"ED99v!\0");
     WR99vE_LINE();
    }
    void READ_LINE()  /*#3 从终端接收一行正文并且把它存到缓冲器IN中 */
    {
     i=0;
     BUF=getchar();
     while(i<LINESIZE && BUF!='\n')
     {
      if(BUF=='@')
      {
       if(i!=0)
       {
        if(IN[i-1]<0)
        {
         IN[--i]=' ';  /*是汉字删掉两个字节*/
         IN[--i]=' ';
        }
        else
         IN[--i]=' ';  /*不是汉字删掉一个字节*/
       }
      }
      if(BUF=='#')
       i=0;
      if(BUF<0)
      {
       IN[i++]=BUF;
       IN[i++]=getchar();
      }
      else
       if(BUF!='@' && BUF!='#')
        IN[i++]=BUF;
      BUF=getchar();
     }
     if(i>=LINESIZEBUF=='\n')
     {

      if(i==0)
       IN[i++]='\n';
      IN[i]='\0';/*存入字符串结束标志*/
     }
     fflush(stdin);
    }
    void WR99vE_LINE()  /*#4 把IN中的内容输出到终端*/
    {
     printf("\n%s",IN);
    }
    void INPUT()  /*#5 从缓冲器IN取来一行正文放到正文文件中*/
    {
     void GO_ED99v();
     void CONNECT();
     void INSERT_CHAIN();
     void WR99vE_LINE();
     ch=IN[0];
     if(IND==1)  /*尚未接收到正文*/
     {
      if(ch=='\n')
         GO_ED99v();  /*转到编辑模式*/
      else
      {
       if(FPTR==0)
       {
        strcpy(IN,"NOFREE!\0");
        WR99vE_LINE();
       }
       else
       {
        ptr=FPTR;  /*YPRT在此模块内主要起链接串之用*/
        XPTR=FPTR;
        strcpy(XPTR->str,IN);
        IND=2;
       }
      }
     }
     else
     {
      if(ch=='\n')  /*空行,从自由链把正文移到正文链并转到编辑模式*/
      {
       CONNECT();
       INSERT_CHAIN();
       GO_ED99v();
      }
      else
      {
       XPTR->next=(struct TEXT*)malloc(sizeof(struct TEXT));
       if(XPTR->next==0)
       {
        CONNECT();
        INSERT_CHAIN();
        strcpy(IN,"NOFREE!\0");
        WR99vE_LINE();
        GO_ED99v();  /*内存空间不足,自动转到编辑模式*/
       }
       else
       {
        XPTR=XPTR->next;
        XPTR->prior=ptr;
        ptr=XPTR;
        XPTR->next=0;
        strcpy(XPTR->str,IN);
       }
      }
     }
    }
    void GO_ED99v()  /*#6  转到编辑模式*/
    {
     void WR99vE_LINE();
     IND=0;
     strcpy(IN,"ED99v!\0");
     WR99vE_LINE();
    }
    void CONNECT()  /*#7  分离后,只需让TPTR,BPTR指向自由链,但是要让FPTR指向一个新的结点,否则将失去指向*/
    {
     YPTR=FPTR;
     FPTR=(struct TEXT*)malloc(sizeof(struct TEXT));
     if(FPTR!=0)
     {
      FPTR->prior=0;
      FPTR->next=0;
     }
    }
    void INSERT_CHAIN()  /*#8  把新输入的正文加到正文链中,紧接在当前行的后面。开始时YPTR指向输入正文的第一行,*/
    {                    /*    XPTR指向最后一行。指针把原有的正文分成两部分,分别为前半和后半。*/
     if(BPTR==0)
     {
      if(TPTR==0)  /*原来没有正文链*/
      {
       TPTR=YPTR;  /*使分离出的自由链的第一行为新的正文链的第一行,自由链的最后一行为新的正文链的最后一行*/
       BPTR=XPTR;
      }
      else
      {
       XPTR->next=TPTR;
       TPTR->prior=XPTR;
     &nbs

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论