首页 > 学院 > 开发设计 > 正文

汉字行编辑程序

2019-11-17 05:35:23
字体:
来源:转载
供稿:网友
我写了一个汉字行编辑程序,请各位多多指教,找出本程序的不足,以提高本程序的功能,! 程序如下:  #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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表