WEB开发网
开发学院软件开发C++ 汉字行编辑程序 阅读

汉字行编辑程序

 2008-03-08 12:42:41 来源:WEB开发网   
核心提示:我写了一个汉字行编辑程序,请各位多多指教,汉字行编辑程序,找出本程序的不足,以提高本程序的功能,指针把原有的正文分成两部分,分别为前半和后半,! 程序如下: #include "stdio.h"#include "stdlib.h"#include "string.h
我写了一个汉字行编辑程序,请各位多多指教,找出本程序的不足,以提高本程序的功能,!   程序如下:     #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

Tags:汉字 编辑 程序

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接