填空题

文本编辑器

发布于 2022-03-03 17:35:06

【注意:本题按通过的Case比例给分】

本题需要让你实现一个类似vi的基于命令模式的文本编辑器,但仅需要少数几个命令。

先介绍一下光标(上图中最左边的是编辑器显示的行号,用来展示用,并不是文本真正的内容,请忽略)

1.该编辑器里的光标是类似vi编辑器里命令模式那样,停留在一个字符上方,而不是字符与字符之间。

2.编辑器文本为空的时候(初始时,或者把内容全部删除以后),会显示一个空行,光标停留在那行行首(如图1)。此时执行o命令的话,在下方插入一行(如图2)。

3.当光标停留在一个空行的时候,光标会显示在行首,但此时执行i命令和a命令的效果是一样的(如图3)。


再介绍一下撤销(undo)和重做(redo)命令:

1.编辑器的undoredo操作跟vi编辑器的一样,是一个基于栈式的撤销功能。每当玩家输入一个命令的时候,如果可撤销的话(见第二条),就该操作压进Undo栈里,栈的大小为无限大,允许撤销全部的操作。

2.只有真正改变编辑器内文本的命令才会进入Undo栈,比如g命令,以及未对文本发生修改的d命令,还有undoredo命令本身都是不可撤销的,即不会进入Undo栈。

3.当执行undo命令的时候,如果Undo栈里有元素,则从栈顶弹出最后一个命令,撤销掉该命令,光标回到执行该命令前的位置,并且将命令压入Redo栈里。

4.当执行redo命令的时候,如果Redo栈里有元素,则从栈顶弹出最后一个被撤销的命令,重新执行该命令,光标回到执行该命令后的位置,并且将命令重新压入Undo栈里。

5.当执行undoredo命令的时候,如果相应的栈里没有元素,则不进行任何操作,忽略该命令。

6.当执行任何输入的命令的时候,都会清空Redo栈,即用undo撤销一个命令C的时候,再执行输入的其他命令以后,则不能再用redo功能重做上一次撤销的命令C

 

完整的命令列表为:

 g x y: 移动光标命令,将光标移动到第x行,第y列上方。当x超过总行数时,则为最后一行。当y超过该行列数的时候,则为最后一列。

i str:在光标所在字符前插入str这句话,光标最终会停留在这句话的最后一个字符上。注意,str必定不为空,但是里面可能包含空格。

a str:在光标所在字符后插入str这句话,其他同上。

o str:在光标所在行的下面另起一新行插入str这句话,其他同上。

dd:删除光标所在行,光标最终会停留在下一行的首字符上。如果删除的是最后一行,则停留在最后一行的首字符上。

d n:从光标所在位置开始,往右删除n个字符(输入保证n&gt0),最多只会删除到行尾,不会跨过当前行。光标最终停留在删除以后的下一个字符位置上。

undo:撤销上一个对文本发生改动的命令,光标也回到上一个命令执行前所在的位置。如果没命令可以撤销,则什么都不做。

redo:重新执行上一个撤销的命令,光标也回到上一个命令执行后所在的位置。如果没有已经撤销的命令,则什么都不做。注意,如果undo了一个命令,再执行新的命令,则也不能redo

其中命令名字与参数、参数与参数中间都是用一个空格分割

 

下图为测试用例例子里的的编辑器里的展示



输入描述: 每个测试输入包含1个测试用例

输入的每一行为一个命令,请处理到输入结束,输入最多不超过1000行,且每行均为合法的命令

输入保证每一行输入的最大字符数不超过1000个字符,且只包含英文、数字和空格输入样例: i abcdef o abcd g 1 10 a abcdef d 4 undo redo dd dd dd a hello world 输出描述: 请输出编辑器打开以后(初始状态),执行完输入命令以后,最后显示的文本输出样例 hello world
关注者
0
被浏览
42
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看