龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

汉字行编辑程序

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
我写了一个汉字行编辑程序,请各位多多指教,找出本程序的不足,以提高本程序的功能,! 程序如下: #include "stdio.h" #include "stdlib.h" #include "string.h" #include "conio.h" #define len 4 #define

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

程序如下:

#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("

-"); /*命令提示符*/

   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("

________________________________________");

   printf("

program for edit ");

   printf("

T:TOP U N:UP N N:NEXT ");

   printf("

E:ENTER L N:LIST D N:DELETE ");

   printf("

R /STR1/STR2/ N:REPLACE F /SFTR1/:FIND ");

   printf("

C N:COPY S N:STORE I:INSERT ");

   printf("

Q:QU99v -: the sing of order ");

   printf("

-----------------------------------------");

   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

   {

   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=='

')

   {

   if(i==0)

   IN[i++]='

';

   IN[i]='\0';/*存入字符串结束标志*/

   }

   fflush(stdin);

  }

  void WR99vE_LINE() /*#4 把IN中的内容输出到终端*/

  {

   printf("

%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=='

')

   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=='

') /*空行,从自由链把正文移到正文链并转到编辑模式*/

   {

   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

  

  

精彩图集

赞助商链接