一個簡單的行編輯程序的功能是:接受用戶從終端輸入的程序或數據,並存入用戶的數據區。由於用戶在終端上進行輸入時,
不能保證不出差錯,因此,若在行編輯程序中“每接受一個字符即存入用戶區”的做法顯然是不恰當的。
較好的做法是,設立一個輸入緩沖區,用以接收用戶輸入的一行字符,然后逐行存入用戶數據區。允許用戶輸入出差錯,
並在發現有誤時及時改正。
例如:當用戶發現剛剛建入的一個字符是錯的時,可補進一個退格符“#”,以表示前一個字符無效;如果發現當前鍵入的行內
差錯較多或難以補救,則可以輸入一個退格符“@”,以表示當前行中的字符均無效。
例如,假設從終端接受了這兩行字符:
whil##ilr#e(s#*s)
outcha@putchar(*s=#++)
則實際有效的是下列兩行:
while(*s)
putchar(*s++)
程序代碼如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define STACK_INIT_SIZE 100 5 #define STACKINCREMENT 10 6 #define OVERFLOW -2 7 #define OK 1 8 #define ERROR 0 9 10 typedef char SElemType; 11 12 //棧結構體 13 typedef struct { 14 SElemType *base; 15 SElemType *top; 16 int stacksize; 17 }SqStack; 18 19 int InitStack(SqStack *S);//初始化棧 20 int Push(SqStack *S,SElemType e);//入棧 21 int Pop(SqStack *S,SElemType *e);//刪除棧中的元素 22 int DestoryStack(SqStack *S);//銷毀棧 23 void LineEdit(SqStack *S);//行編輯程序 24 int ClearStack(SqStack *S);//清空棧中的元素 25 26 //初始化棧 27 int InitStack(SqStack *S) { 28 S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); 29 if(!S->base) { 30 exit(OVERFLOW); 31 } 32 S->top = S->base; 33 S->stacksize = STACK_INIT_SIZE; 34 35 return OK; 36 } 37 38 //入棧 39 int Push(SqStack *S,SElemType e) { 40 if((S->top-S->base)>=S->stacksize) { 41 S->base = (SElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType)); 42 if(!S->base) { 43 exit(OVERFLOW); 44 } 45 S->top = S->base + S->stacksize; 46 S->stacksize += STACKINCREMENT; 47 } 48 *S->top++ = e; 49 //printf("%c\n",e); 50 return OK; 51 } 52 53 //刪除棧中的元素 54 int Pop(SqStack *S,SElemType *e) { 55 if(S->top == S->base) return ERROR; 56 *e = *--S->top; 57 return OK; 58 } 59 60 61 //清空棧中的元素 62 int ClearStack(SqStack *S) { 63 S->top = S->base; 64 return OK; 65 } 66 67 //銷毀棧 68 int DestoryStack(SqStack *S) { 69 S->top = S->base; 70 free(S->base); 71 S->top = NULL; 72 S->base = NULL; 73 return OK; 74 } 75 76 //行編輯程序 77 void LineEdit(SqStack *S) { 78 SElemType *p,ch,c; 79 InitStack(S); 80 ch = getchar(); 81 while(ch != EOF) { 82 while(ch!=EOF&&ch!='\n') { 83 switch(ch) { 84 case '#':Pop(S,&c);break; 85 case '@':ClearStack(S);break; 86 default:Push(S,ch);break; 87 } 88 ch = getchar(); 89 } 90 p = S->base; 91 while(p!=S->top) { 92 printf("%c",*p); 93 ++p; 94 } 95 ClearStack(S); 96 if(ch!=EOF) ch = getchar(); 97 } 98 } 99 100 int main() 101 { 102 SqStack sq; 103 int f; 104 LineEdit(&sq);//進行括行編輯 105 DestoryStack(&sq);//將棧銷毀 106 return 0; 107 }