清除当前的打印控制台行


72

如何在C中擦除当前打印的控制台行?我正在Linux系统上工作。例如 -

我想在同一行上打印再见,代替您好。


1
ncurses库可能会执行此操作。我不太清楚提供答案,但是这里有docs相关问题的链接。此评论基于Wil Shipley在2009年的回答,可能会删除。
Tom Zych

Answers:


72

您可以使用VT100转义码。包括xterm在内的大多数终端都支持VT100。要擦除线,此为^[[2K。在C中,它给出:


52
这不会将光标重置到行的开头(至少在我的终端中),因此\r仍然需要。请注意,%c不必使用。另类:printf("\33[2K\r");
Stephan202

5
请注意,Windows不支持ANSI格式(ANSI转义码)。但是仍然可以使用printf("\r ");
CocoaBob 2014年

2
@CocoaBob从Windows 10更新TH2起已更改
Hydranix


1
@LưuVĩnhPhúc-问题结束于:我正在Linux系统上工作
mouviciel 2016年

57

您可以使用\r回车)将光标返回到行首:

这将在同一行上打印再见。但是,它不会删除现有字符,并且由于byehello短,因此您最终会得到byelo。要擦除它,您可以延长新打印的时间来覆盖多余的字符:

或者,首先用一些空格删除它,然后打印新字符串:

那将打印问候,然后转到行的开头并用空格覆盖它,然后再次回到开头并打印bye


45

一些有价值的微妙之处...

\33[2K 删除光标当前所在的整行

\033[A将光标上移一行,但移至同一列,即不移至该行的开头

\r将光标移至该行的开头(r用于回车NB回车不包括换行符,因此光标保持在同一行)但不会擦除任何内容

具体来说,在xterm中,我尝试了上述答复,发现删除行并从头开始重新开始的唯一方法是序列(来自@ Stephan202以及@vlp和@mantal的上述注释) \33[2K\r

在实施注意事项上,为了使它在倒数计时的情况下正常工作,因为我没有'\n' 在每个末尾使用换行符fprintf(),所以我每次都必须进行fflush()流处理(为了给您一些上下文,我开始xterm在Linux机器上使用fork而不重定向stdout,我只是fdfile使用非阻塞文件描述符写入缓冲的FILE指针,而该描述符位于伪终端地址上,在本例中为/dev/pts/21):

请注意,我同时使用\ 33 [2K序列来擦除该行,然后使用\r回车序列来将光标重新定位在该行的开头。我fflush()每次都不得不fprintf()这么做,因为最后没有换行符'\n'。不需要fflush()的相同结果将需要附加的序列上一行:

请注意,如果在要写入的行的正上方有行,则第一个fprintf()会覆盖该行。您将不得不在上面多留一行,以允许第一行向上移动:


3
\r是“回车”而不是“倒带”的缩写,是老式打字机的遗物,它们分别用于“将光标移回第一列”(\r)和“将页面前进到下一行”(\n)的操作。
ijustlovemath

1
\33[2K是一条路!对我来说最好的问题解决方案。也可在Windows ConEmu上使用
Grzegorz '18

由于某些原因,当我在终端的MacOS上运行一个简单的C可执行文件(bash,zsh等)时,所有这些奇妙的答案都对我不起作用。我得到的各种怪异的行为,和怪异字符(或根本没有)印刷的,但从来没有明确的线高于打印过这等
Motti Shneor

4

您可以使用\ b删除该行


6
\ b不会只是将光标移回一个字符吗?角色仍然在那里。我猜你可以做类似“ \ b \ b”的事情。
安德烈·米勒

在我的Linux框中,该行被删除。也许其他平台上的行为有所不同。
亚历山大·艾格

3

通常,当字符串末尾带有“ \ r”时,仅打印回车符而没有换行符。如果您具有以下条件:

输出将是:

我可以建议的一件事(也许是一种解决方法)是让一个以NULL终止的固定大小的字符串初始化为所有空格字符,并以'\ r'结尾(每次打印之前),然后使用strcpy将您的字符串复制到它(没有换行符),因此每个后续打印都会覆盖前一个字符串。像这样:

您可以进行错误检查,以使my_string长度总是至少比少一倍str,但是您已经掌握了基本思想。


2

i遍历char数组字。 j跟踪字长。 "\b \b"在回退时擦除单词。


2

该脚本已为您的示例进行了硬编码。

单击此处获取


1

有一个简单的技巧可以在这里工作,但是需要在打印之前进行准备,您必须将要打印的内容放入变量中然后再打印,这样才能知道删除字符串的长度。这里有一个例子。


0

刚刚找到了这个旧线程,寻找某种转义序列来清空实际行。

没有人想到printf返回写入的字符数的想法(或者我错过了),这很有趣。因此,只需打印'\ r'+与返回的printf一样多的空白字符,您就可以完全空白的先前写入的文本。

由于我无法使用VT100,因此似乎必须坚持使用该解决方案


0

上面的命令将做什么:

  1. 它将打印问候,并且光标将保持在“ o”(使用\ c)

  2. 然后它将等待1秒(睡眠1)

  3. 然后它将用bye代替hello。(使用\ r)

NOTE : Using ";", We can run multiple command in a single go.


这是bash,不是C
Orgg

0

在Windows 10下,可以通过在当前控制台中激活VT100模式以使用转义序列来使用VT100样式,如下所示:

参见以下链接:Windows VT100

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.