C printf:在打印文本上方插入行

C printf: insert line above printed text

我想在打印行上方使用 printf 打印而不覆盖旧行。下面的代码打印

0
1
Hallo
A0
A1
A2
A3
A4

我希望输出为

0
1
Hallo
A0
A1
A2
A3
A4
2
3
4

是否可以使用转义码(如排队)来做到这一点?

#include "stdio.h" 

#define ANSI_LINE_UP                "3[3A"


int main() {
    for (int i = 0; i < 5; i++) {
        printf("%d\n", i);
    }

    printf(ANSI_LINE_UP "Hallo\n");
    for (int i = 0; i < 5; i++) {
        printf("A%d\n", i);
    }


    return 0;
}

如果相关的话,我使用的是 Kubuntu 18.04。

为了更清楚地说明我想要什么:

我想在最后有一些 printf 的输出,所以它看起来像这样:

printf(...) printf(...)

specialprintf(,) specialprintf(,)

注意:执行时所有打印的顺序可能不同。我只需要先是普通的,然后是特殊的。如果特殊的顺序不同,还是可以的。

这是嵌入式项目的一部分。 @Arkku 解决方案很好,但我没有完全按照我的意愿工作。

显然这取决于您的终端支持什么,但如果它支持 3[<count>L 插入,它应该按如下方式工作:

int main() {
    const int up_lines = 3;
    const int new_lines = 6;

    for (int i = 0; i < 5; ++i) {
        printf("%d\n", i);
    }

    for (int i = 0; i < new_lines; ++i) {
        // make space for existing lines to move down
        putchar('\n');
    }
    // move up and insert the new (empty lines)
    printf("3[%dA3[%dL", up_lines + new_lines, new_lines);

    for (int i = 0; i < new_lines; ++i) {
        printf("A%d\n", i);
    }

    // move back down below original lines
    printf("3[%dB", up_lines);

    return 0;
}

基本上,您首先要为原始行向下移动腾出空间,方法是输出等于或大于您要插入的行数的换行符(当终端位置非常靠近底部时,此步骤变得相关旧线会移出屏幕)。然后你向上移动到插入位置(现在已经移动了你打印的换行数)并插入带有 3[<count>L.

的行数

edit: 显然你可以重复多次,也就是说,你不必事先知道要插入多少行和插入哪里,只要你回到最后一行在每批插入之后。例如,您可以通过始终只在底部打印一个换行符来一次插入一行,然后向上移动到插入位置(记住要考虑刚刚在其间添加的一行),在那里插入该行,然后移动回到底部。