gpt4 book ai didi

在终端中打印可更新状态的 C 程序/建议

转载 作者:行者123 更新时间:2023-11-30 14:55:39 27 4
gpt4 key购买 nike

我试图在终端中完成打印语句,如下所示:

温度位置 1 = 100 C

温度位置 2 = 120 C

值可以更改的地方。所以我不知道如何处理这个问题。我应该尝试清除整个终端并再次打印吗?回车符仅清除最近的行(例如位置 2 行)那么如何更改温度 1 的值?非常感谢!

最佳答案

您的 2 行输出存在问题。通常,为了以行/列(或 x,y)为基础处理格式化输出,您将需要使用像 ncurses 这样的屏幕输出库来提供一些可靠的可移植性。

另一种可移植性差得多、依赖于终端的处理光标定位的方法是使用 ANSI 转义序列。 printf 将解释 ANSI 转义,但不是在所有终端上、不是在所有操作系统或实现上。

Linux(大多数 vt100 仿真)将处理 ANSI 转义,对于 Windows,Win10(周年更新)和以前的 WinX 版本之间有不同的方法来处理转义。两者均在 Console Virtual Terminal Sequences 处进行了解释

在 Linux 上,您可以使用 ESC[1A 序列(使用八进制数字 \033[1A 进行转义写入 033 或使用十六进制 \0x1b[1A 写入 1b)将光标向上移动一行(和 '\r' 移回开头而不换行)。因此,ANSI 转义 \r\033[1A 只是将光标移回行首并向上移动一位。 (您可以在 Windows 上使用相同的序列,但如何实现它取决于 Windows 版本 - 请参阅提供的链接)

一个简单的显示实现,例如

Location 1 = 3.00 C
Location 2 = 37.40 F

在 Linux 上每秒覆盖一次温度(实际上是两行)可能是:

#include <stdio.h>
#include <unistd.h>

double c_to_f (double c)
{
return c * 9.0 / 5.0 + 32;
}

void print_temps (double t1, double t2)
{
printf ("Location 1 = %.2lf C\nLocation 2 = %.2lf F\r\033[1A",
t1, t2);
fflush (stdout);
}

int main (void) {

for (int i = 0; i < 4; i++) {
print_temps (i, c_to_f(i));
sleep (1);
}

printf ("\n\n"); /* tidy up with newlines */

return 0;
}

(其中从 CF 的转换只是为了提供位置 2 的第二个温度)

上面的代码只是每秒更新位置 1 和位置 2 温度线一次,持续 4 秒,温度为 0-3 C。如果您使用的是 Windows,我将让您根据您的特定 Windows 版本点击上面的链接。

另请注意,ncurses 库中提供了其他控制光标的方法,或者通过 struct termios 中提供的 termios.htcsetattr 函数进行有限程度的控制。

关于在终端中打印可更新状态的 C 程序/建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45646681/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com