[我意识到这个问题已经有很多年了,但它的核心问题(或两个问题)涉及到OP,编程教学以及假设。]
包括一个mod在内的一些人认为这是不可能的。在一些(包括最明显的)情况下,确实如此。但有趣的是,这对于OP来说并不是显而易见的。
这种不可能性假定上下文是在基于行的文本控制台上运行从C编译生成的可执行文件(例如console+sh或X-term+csh或Terminal+bash),这是一个非常合理的假设。但是,“正确”的答案(“%8d
”)对于OP来说并不够好,同时也并不显然,这表明附近可能存在一个相当大的问题...
考虑Curses(以及它的许多变体)。在其中,您可以导航“屏幕”,“移动”光标,并“重绘”文本输出的部分(窗口)。在Curses环境中,绝对是可能的,即通过动态调整“窗口”大小以容纳更多数量。但即使是Curses也只是一个屏幕“绘画”抽象。没有人建议这样做,可能是正确的,因为在C中的Curses实现并不意味着它是“严格的C”。好吧。
但这到底意味着什么?为了回答“这是不可能的”这个问题,这意味着我们正在对运行时系统做出一些说法。换句话说,这不是理论性的(例如,“如何对静态分配的int
数组进行排序?”),这可以解释为完全忽略运行时任何方面的“封闭系统”。
但是,在这种情况下,我们有I / O:具体来说,是printf()
的实现。但是,这就是机会,可以在响应中提供更有趣的信息(尽管可以承认的是,询问者可能没有深挖)。
假设我们使用不同的假设。假设OP相当“聪明”,并且理解无法编辑基于行的流中的先前行(如何纠正线打印机输出的字符的水平位置?)。还假设OP不只是一个在做家庭作业并且没有意识到这是一个旨在探讨“流抽象”的“恶作剧”问题的孩子。进一步假设,OP想知道:“等等...如果C的运行时环境支持STDOUT的概念 - 如果STDOUT只是一个抽象层次 - 那么为什么没有一个终端抽象,既可以垂直滚动,又可以支持可定位光标?两者都是在屏幕上移动文本。”
因为如果我们试图回答的问题是这样的,那么您只需要看到:
ANSI 转义序列
几乎所有视频终端制造商都添加了供应商特定的转义序列,以执行诸如在屏幕上任意位置放置光标等操作。例如,VT52 终端允许通过发送 ESC 字符、Y 字符,然后是两个数字值分别等于 x,y 位置加 32 的字符来将光标放置在屏幕的 x,y 位置(从 ASCII 空格字符开始并避免控制字符)。Hazeltine 1500 也有类似的功能,使用 ~、DC1 和 X 和 Y 位置之间用逗号隔开。虽然这两个终端在这方面具有相同的功能,但必须使用不同的控制序列来调用它们。
第一个支持这些序列的流行视频终端是 1978 年推出的 Digital VT100。该型号在市场上非常成功,引发了各种 VT100 克隆产品,其中最早和最受欢迎的是 1979 年推出的价格更便宜的 Zenith Z-19。其他产品包括 Qume QVT-108、Televideo TVI-970、Wyse WY-99GT,还有许多其他品牌的可选“VT100”或“VT103”或“ANSI”模式,其兼容性不同。这些的流行逐渐导致越来越多的软件(特别是公告栏系统和其他在线服务)假定转义序列有效,从而导致几乎所有新终端和仿真器程序都支持它们。
事实上,早在 1978 年就已经可以使用 "ANSI" 转义序列了。C 语言诞生于 1972 年,K&R 版本于 1978 年确立。如果我们也能假定: "好吧,假设您的终端具有 VT100 功能。" 那么就有一个 "C 语言" 的答案。顺便说一下,不支持 ANSI 转义序列的控制台是什么?没错,是 Windows 和 DOS 控制台。但在几乎所有其他平台(Unix、Vaxen、Mac OS、Linux)上,您都可以期望支持它们。
简而言之——没有不陈述运行时环境假设的合理答案。由于大多数运行时环境(除非您使用桌面计算机市场份额的 80 年代和 90 年代来计算 '大多数')自 VT-52 以来就具备了这个功能,所以我认为完全不可能——只是为了使其成为可能,需要进行大量的工作,并且不像 %8d
那么简单,尽管问题看起来像 OP 已经知道了。
我们只需要澄清假设即可。
如果有人认为输入/输出是例外情况,即我们只需要考虑运行时环境(或甚至是硬件)的时候,请查看 IEEE 754 浮点数异常处理。对于那些感兴趣的人:
英特尔浮点数案例研究
根据加州大学伯克利分校的William Kahan教授的说法,1996年6月发生了一个经典案例。一枚名为Ariane 5的卫星运载火箭在发射后不久便倒立翻滚,并将自身和价值超过5亿美元的有效载荷散落在了法属圭亚那的一个沼泽地区。Kahan发现灾难可以归咎于一种编程语言,该语言忽略了IEEE 754中默认的异常处理规范。在发射时,传感器报告了强烈的加速度,导致了旨在重新校准火箭惯性引导系统的软件出现整数转换溢出。