行编辑程序
一个简单的行编辑程序的功能是:接收用户从终端输入的程序或数据,并存入用户的数据区。由于用户在终端上进行输入时,不能保证不出差错,因此若在编辑程序中,”每接收一个字符即存入用户数据区“的做法显然不是最恰当的。
较好的做法是,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区。允许用户输入出差错,并在发现有误时可以及时更正,
例如,当用户发现刚刚键入的一个字符是错的时,可补进一个退格符‘#’,以表示前一个字符无效;如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符‘@’,以表示当前行中的字符均无效。
例如,假设从终端接收了这样两行字符:
whli##ilr#e(s#*s)
outcha@ putchar(*s=#++);
则实际有效的是下列两行:
while(*s)
putchar(*s++);
为此,可设这个输入缓冲区为一个栈结构,每当从终端接受了一个字符之后先作如下判别:
如果它既不是退格符‘#’,也不是退行符‘@’,则将该字符压入栈顶;
如果是一个退格符,则从栈顶删去一个字符;
如果是一个退行符,则将字符栈清为空栈。
LineEdit.c利用了前面的C封装的顺序栈对象 用线性表表示的顺序栈
实现了简单的行编辑功能。
LineEdit.c文件
#include <stdio.h>
#include <malloc.h>
#include "LinearListStack.h"
void lineEdit(){
char elem,ch;
LinearListStack *stack = InitLinearListStack();
ch = getchar();
while(ch != EOF){
while(ch != EOF && ch != '\n'){
switch(ch){
case '#':
if(stack->length(stack)){
stack->pop(stack,&elem);
}
break;
case '@':
stack->clear(stack);
break;
default:
stack->push(stack,&ch);
break;
}
ch = getchar();
}
stack->risePrint(stack);
stack->clear(stack);
if(ch != EOF) ch = getchar();
}
DestroyLinearListStack(stack);
}
int main(void)
{
lineEdit();
return 0;
}
编译:
gcc LinearListStack.c LinearListStack.h LineEdit.c -o LineEdit
运行LineEdit,输入:
whli##ilr#e(s# *s)
while( *s)
put###outcha@ putchar( * s++);
putchar( * s++);
hello@world
world
yhankou@123456##]
1234]
程序输入回车后进行下一行的输入,要想结束程序,需要输入EOF结束符。
在windows平台,EOF的输入是在一个新行的开头输入ctrl + z;
在unix环境下,EOF的输入是在一个新行的开头输入ctrl + d。
网友评论