用C语言从命令行编辑文本体

用C语言从命令行编辑文本体,c,input,C,Input,我正在用C语言编写一些小程序——一些登录、注销、创建帐户、向另一个帐户发送消息——我可以在此基础上进行修改、创新和完善,以完善我的C语言技能 我想弄清楚的是如何实现“撰写消息”选项的一部分。在提示您输入邮件的收件人、主题和正文后,我希望能够返回并编辑它们,而不必重新键入整个内容。因此,如果我选择“编辑消息”选项,它会写下我所拥有的内容,让我返回并更改某些内容 我在中做过类似的事情,或者开始做类似的事情,所以我基本上了解如何在机器级别实现它,但我不知道如何在C中实现它。我该如何做 在C语言中,像下

我正在用C语言编写一些小程序——一些登录、注销、创建帐户、向另一个帐户发送消息——我可以在此基础上进行修改、创新和完善,以完善我的C语言技能

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

我在中做过类似的事情,或者开始做类似的事情,所以我基本上了解如何在机器级别实现它,但我不知道如何在C中实现它。我该如何做

在C语言中,像下面这样的事情让我感到困惑:

  • 处理潜在的长输入的好方法
  • 如何写出文本并允许用户编辑它,而不必返回到某一点
  • 如何控制光标的位置
此外,如果以前已经这样做过,并且存在类似的函数库(甚至是我不知道的标准库),请注意,我确实希望自己的函数库能够用于学习

我想我脑海中的方法是一次读取一个字符的消息正文,这样我就可以解释回车,并创建多行消息。但我不确定我将如何通过它后退。我想从命令行(?)执行此操作将非常困难

如果不是不可能,请将光标移回并擦除已超出输入缓冲区的字符。。。我每次都要“重新绘制屏幕”吗?比如,我可以控制整个控制台,在特定位置读写击键吗?还是离机器太近了?我用汇编做的,但是用了16位中断,我不允许用在C。。。这是我在汇编中写的:

(曾经在这里的图像已经消失)

程序将一个字节值转换为表示该字节的两个字符代码,然后跳转到右列并写入原始字节(显示为字符),然后跳回并在下一个插槽中再写出两个十六进制数。。。依此类推,从左到右,从上到下。。。这很容易,但我不知道如何在C中实现。我所能做的就是输入和输出样式,向控制台写入行,向上滚动窗口等等。

我编写了一个文本编辑器

我做C已经20年了

文本的数据结构是我写过的最复杂的单一数据结构;这是一种数据结构,正如您所指定的,它可以有效地处理任意长度的文本

如果你是C语言的新手,你就吃得太多了


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

这与系统(OS)高度相关。我认为您正在尝试在Windows上执行此操作

您可以使用


如果你想研究一些库以供参考(在你自己开始之前),一个好的库是最好的。

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


因此,您注定要使用某种类型的库。考虑到您似乎想要一个文本界面,我建议您看看的可移植版本。

在ANSI C中,没有办法制作可移植的行编辑器。如果你自己运行,你将不得不为你希望你的程序运行的每一个新的操作系统重新运行它

如果我可以提出一个建议的话,我将使用一个预先存在的库来完成所有那些艰苦的、特定于平台的脏活,并且通过这一步,学习如何处理任意长度的输入之类的事情。然后,当你的代码运行正常(并且是好的)时,学习如何做所有这些肮脏的工作,并拿走库的拐杖。这样,你不是在处理整个事情,而是把它分解成更容易管理的部分

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

另外,要知道,如果您希望代码是可移植的,删除库依赖项意味着,如果您希望移植它,您必须a)重写所有脏工作代码,或者b)将库重新添加

以一个笑话结束这一切,这是你的大脑和图书馆:

巨大肱骨不规则长肌和巨大肱骨长肌。
(如果我看得更远一点,那就是站在巨人的肩膀上。)
--艾萨克牛顿

这是你没有图书馆的大脑:

如果我没有看到其他人那么远,那是因为巨人站在我的肩膀上。
--哈尔·阿贝尔森


至于保存数据,我猜a是可用的最好的数据结构:在简化的形式中,它是一个字符串树。当您想要在屏幕上打印它时,您所需要做的就是按预定顺序遍历它,然后打印它。将一行一分为二涉及到一个相对简单的树操作:添加一个叶子。最困难的部分是拆分字符串本身(复制字符串,将旧端设置为0,添加叶子,添加指针)

现在,有一个跟踪光标的问题。。。您可以留下一条面包屑痕迹,以便从根跟踪到光标当前所在的位置


还考虑了一个可调整大小的控制台。。。也就是说,如果你想让你的编辑器在80或200个字符宽的终端上工作…

那家伙指定他要自己滚动。Windows控制台API是让他自己滚动的。阅读资料对学习很有帮助。好的,我来看看