一个简单的行编辑程序的功能是,接受用户从终端输入的程序或数据,并存入用户的数据区,由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,每接受一个字符即存入用户数据区的做法显然不是最恰当的。
应该设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区。允许用户输入出差错,并在发现有误时可以及时更正。列如当用户刚发现键入的一个字符是错的时,可以补进一个退格符#,以表示前一个字符无效,如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符@,以表示当前行中的字符均无效。
输入:一行终端接受的字符.
输出:实际有效的字符。
运行结果:
算法思想:
设一个栈结构,每当从终端接受了一个字符之后。如果它既不是退格符也不是退行符,则将该字符压入栈顶。如果是一个退格符,则从栈顶删去一个字符,如果他是一个退行符,则将字符栈清为空栈。
算法实现:
void LineEdit(){
//利用字符栈S,从终端接受一行并传送至调用过程的数据区
//设一个栈结构,每当从终端接受了一个字符之后。如果它既不是退格符
//也不是退行符,则将该字符压入栈顶。如果是一个退格符,则从栈顶删
//去一个字符,如果他是一个退行符,则将字符栈清为空栈。
SqStack<char> S;
char ch;
char e;
InitStack(S);//构造空栈
ch=getchar(); //从终端接受第一个字符
while(ch!=EOF){//EOF为全文结束符
while(ch!=EOF&&ch!='\n'){
switch(ch){
case '#': //当栈非空时退栈
Pop(S,e);
break;
case '@': //重置S为空栈
ClearStack(S);
break;
default:
Push(S,ch); //有效字符进栈,为考虑栈满情形
break;
}
ch=getchar();//从终端接受下一个字符
}
PrintStack(S);
ClearStack(S);//重置栈为空栈
if(ch!=EOF)
ch=getchar();
}
DestroyStack(S);
}