我想将光标移动到x,y位置,所以我使用:
#include <stdio.h>
int main()
{
int x = 10, y = 10
printf("\e[%d;%df",y,x);
printf("HelloWorld");
}
但它的输出是:
[10;10fHelloWorld
我尝试从\ e更改为%c,0x1B作为我朋友的示例文件,但它仍然不起作用。它只适用于我的朋友文件。我该怎么做才能让它发挥作用?或者我应该使用windows.h吗?
答案 0 :(得分:2)
代码中的\e
错误,但是当您使用转义字符的ASCII代码对其进行重新命名时,也会将f
更改为H
以使其成为游标的正确序列定位,您的代码将适用于实现ANSI转义序列的所有终端。这包括Linux上的许多终端和其他类似* nix的系统。
Windows控制台还支持从Windows 10开始的ANSI转义序列,但默认情况下cmd.exe
禁用此支持以实现向后兼容性,因此要使此代码在Windows 10上运行,您必须明确启用此模式:
#include <stdio.h>
#include <windows.h>
// this line is only for older versions of windows headers (pre Win 10):
#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
int main(void)
{
// enable ANSI sequences for windows 10:
HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD consoleMode;
GetConsoleMode(console, &consoleMode);
consoleMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
SetConsoleMode(console, consoleMode);
int x = 10, y = 10;
printf("\x1b[%d;%dH", y, x);
printf("HelloWorld");
}
但是,所有人都说,你应该考虑使用curses
。 curses库有两种广泛的实现,ncurses
和pdcurses
。两者都适用于各种系统。对于* nix系统,我的个人建议是ncurses
,对于Windows,我的建议是pdcurses
。如果您只是代码#include <curses.h>
,则可以根据需要链接到两个库。你得到的是对终端/控制台输出的完全控制,而不依赖于可能的非便携式转义序列(它也适用于早于Windows 10的版本)。
要了解如何使用curses
,请考虑NCURSES Programming HOWTO。