逃脱角色不起作用

时间:2017-11-07 12:13:13

标签: c

我想将光标移动到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吗?

1 个答案:

答案 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库有两种广泛的实现,ncursespdcurses。两者都适用于各种系统。对于* nix系统,我的个人建议是ncurses,对于Windows,我的建议是pdcurses。如果您只是代码#include <curses.h>,则可以根据需要链接到两个库。你得到的是对终端/控制台输出的完全控制,而不依赖于可能的非便携式转义序列(它也适用于早于Windows 10的版本)。

要了解如何使用curses,请考虑NCURSES Programming HOWTO