我写了一个汉字行编辑程序,请各位多多指教,找出本程序的不足,以提高本程序的功能,!
程序如下:
#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
|