在编写较大的程序时,我偶然发现了彩色文本输出的一个小问题。这是一个更简单的程序,可重现此问题。

#include <stdio.h>

#define COL_RESET "\033[0m"
#define COL_BG_RED  "\x1B[41m"

char *str = "the quick brown fox jumped over the lazy dog";

int main(int argc, char *argv[])
{
    int i = 10;
    while (i) {
        puts(COL_BG_RED);
        puts(str);
        puts(COL_RESET);
        puts(str);
        i--;
    }
    return 0;
}

现在这是我运行程序时得到的:

第一次-预期结果

第二次

如您所知,即使将颜色重置为红色,程序仍决定随机打印行。在新的终端中启动时,它始终会打印预期的结果。除非我运行clear,否则不能保证输出不会像第二张图片一样被扭曲。

在图片中,我正在使用xterm,尽管其他终端也做同样的事情。

我该怎么做才能防止这种情况?

最佳答案

如前所述,这是某些知名终端的已知行为:滚动(或反向滚动)时,屏幕上新近清除的区域将填充当前的背景色。 Linux控制台可以做到这一点(除了terminal database中提到的几年前的故障之外)。 xterm does it

在ncurses中,几种相关的行为作为bce(背景色擦除)功能集中在一起:

  • 由于滚动
  • 而填充了新清除的行
  • 删除显示,以及删除以光标结尾或以光标开头的部分。
  • 删除一行,或删除光标之前或从光标到该行末尾的部分
  • 在光标位置
  • 插入(空白)
  • 删除字符

  • 通常,ncurses会填满空格(只有在终端条目为poorly chosen时这才是问题),您将不会看到这一点。但是使用简单的转义序列意味着您可以稍微了解bce的细微差别。

    直接使用转义序列来打印颜色的终端应用程序应在写入任何其他不希望着色的文本之前重置颜色。其他应用程序(例如,shell中的行编辑)在删除行中的文本时必须牢记此规则

    09-10 01:13
    查看更多