从C中的命令行编辑文本正文

时间:2009-05-09 08:02:43

标签: c input

我正在用C编写一些小程序 - 一些登录,注销,创建帐户,发送消息到另一个帐户的交易 - 我可以建立并改变和创新并改进我的优化C中的技能。

我想弄清楚的是如何实现“撰写邮件”选项的一部分。在系统提示您输入邮件的收件人,主题和正文后,我希望能够返回并编辑它们 - 而无需重新输入整个内容。因此,如果我选择“编辑消息”选项,它会写出我所拥有的内容,然后让我回去改变一些内容。

我在x86 assembly做过类似的事情,或者开始做这样的事情,所以基本上我理解这是如何在机器级实现的,但我不知道如何实现它在C.我该怎么做?

以下事情让我感到困惑:C:

  • 处理潜在长篇输入的好方法
  • 如何撰写文本并允许用户编辑文本,而不会超出某一点
  • 如何控制光标的位置

另外,如果之前已经完成,并且存在这样的功能库(即使是我不知道的标准库),请注意我确实想要自己滚动为了学习目的。

我想我脑子里的方法是一次读取一个字符的消息体,这样我就可以解决回车并创建一个多行消息。但我不确定如何通过它退格。我想从命令行(?)执行此操作真的很难。

如果不是不可能的话,将光标向后移动并擦除已经超出输入缓冲区的字符......我是否每次都要“重新绘制屏幕”?就像我可以控制整个控制台,只是读取和写入某些位置的按键?或者这太靠近机器了?我用汇编做了一些,但是使用了16位中断,我不允许在C中使用......这就是我在汇编中写的:

(以前的图像已经消失)

程序将字节值转换为表示该字节的两个字符代码,然后跳转到右列并写入原始字节(显示为字符),然后跳回并写出另外两个十六进制数字,在下一个插槽中...依此类推,从左到右,从上到下......这很简单,但我没有想法如何在C中实现它。我只能做是INT 21样式输入和输出,在控制台上写行,向上滚动窗口等等。

5 个答案:

答案 0 :(得分:2)

ANSI C中没有办法制作便携式行编辑器。如果你自己动手,你将 为你希望你的程序工作的每个新操作系统重新打印它。

如果我可以提出一个建议,我会使用一个预先存在的库来完成所有那些特定于平台的硬件工作,并且通过这个方法,学习如何处理像任意长度输入这样的事情。 。然后,当你的代码工作(并且很好)时,学习如何做所有那些肮脏的工作,并带走库 - 拐杖。这样,你就不会解决整个问题 - 你将其分解为更易于管理的部分。

即使这有点过于简单化了。我花了很长时间学习如何处理任意长度的输入。

另外,要知道,如果你希望你的代码是可移植的,那么删除库依赖关系将意味着,如果要移植它,你将不得不a)重写所有脏工作代码,或者b )重新添加库。

要结束这一切的笑话,这是你的大脑库:

  

Pigmaei gigantum humeris impositi plusquam ipsi gigantes vident。
  (如果我进一步看到它是站在巨人的肩膀上。)
   - 艾萨克·牛顿

这是没有图书馆的大脑:

  

如果我没有看到其他人,那是因为巨人站在我的肩膀上    - Hal Abelson

答案 1 :(得分:1)

你说你想避免使用库(标准或其他),但遗憾的是在C中所有输入和输出都是通过库执行的 - 语言本身绝对没有输入/输出功能。

所以你注定要使用某种类型的库。鉴于您似乎想要一个文本界面,我建议您查看便携版cursesPDCurses

答案 2 :(得分:0)

我写了一个文本编辑器。

我已经做了二十年的C。

文本的数据结构是我写过的最复杂的单一数据结构;这是一个数据结构,可以按照您的指定有效地处理任意长度的文本。

如果你是C的新手,那么你咬的东西比你可以咀嚼的多。

我建议一个简单的数据结构,比如缓冲区或链表 - 你不能处理任意长度的文本,但它总比没有好。

答案 3 :(得分:0)

这与系统(OS)高度相关。我想你正试图在Windows上这样做。

您可以使用Windows Console API来执行此操作。

如果您想学习一些库以供参考(在您自己推出之前),一个好的库就是GNU Readline

答案 4 :(得分:0)

至于保存数据,我猜测rope'是可用的最佳数据结构:在简化形式中,它是一个字符串树。当您想要在屏幕上打印时,您需要做的就是预先按顺序进行打印并打印出来。将一行分成两行涉及一个相对简单的树操作:添加一个叶子。困难的部分是分裂字符串本身(复制字符串,将旧结束设置为0,添加叶子,添加指针)...

现在,存在跟踪光标的问题......你可以留下从根到光标所在位置的痕迹痕迹。

还有一个可调整大小的控制台......也就是说,如果你想让你的编辑器工作,无论终端是80或200个字符宽......