美文网首页
顺序栈的应用三:行编辑

顺序栈的应用三:行编辑

作者: Mr_Bluyee | 来源:发表于2018-08-31 14:02 被阅读79次

    行编辑程序

    一个简单的行编辑程序的功能是:接收用户从终端输入的程序或数据,并存入用户的数据区。由于用户在终端上进行输入时,不能保证不出差错,因此若在编辑程序中,”每接收一个字符即存入用户数据区“的做法显然不是最恰当的。

    较好的做法是,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区。允许用户输入出差错,并在发现有误时可以及时更正,

    例如,当用户发现刚刚键入的一个字符是错的时,可补进一个退格符‘#’,以表示前一个字符无效;如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符‘@’,以表示当前行中的字符均无效。

    例如,假设从终端接收了这样两行字符:

    whli##ilr#e(s#*s)
      outcha@  putchar(*s=#++);
    

    则实际有效的是下列两行:

    while(*s)
      putchar(*s++);
    

    为此,可设这个输入缓冲区为一个栈结构,每当从终端接受了一个字符之后先作如下判别:
    如果它既不是退格符‘#’,也不是退行符‘@’,则将该字符压入栈顶;
    如果是一个退格符,则从栈顶删去一个字符;
    如果是一个退行符,则将字符栈清为空栈。

    LineEdit.c利用了前面的C封装的顺序栈对象 用线性表表示的顺序栈
    实现了简单的行编辑功能。

    github源码

    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。

    相关文章

      网友评论

          本文标题:顺序栈的应用三:行编辑

          本文链接:https://www.haomeiwen.com/subject/bepswftx.html