如何在C和C++中使用ANSI Escape Codes来输出带颜色的文本?

18 浏览
0 Comments

如何在C和C++中使用ANSI Escape Codes来输出带颜色的文本?

我在这里读到了关于ANSI-C转义码的内容。我试着在C/C++的printf/std::cout中使用它来给控制台输出的文本上色,但没有成功。

我的尝试:

#include

#include

int main() {

int a=3, b=5;

int &ref = a;

ref = b;

//cout << "\155\32\m" << a << b <<'\n'; //这里打印出m→m 5,没有上色的文本

printf("\155\32\m %d",a); //这里也打印出相同的结果 - m→m 5

getchar();

}

我该如何使用这些转义码来输出带颜色的文本到控制台?

我有什么遗漏吗?

另外,我记得在某些C++代码中看到过对这个函数的调用

textcolor(10);

但在g++和Visual Studio中都出现了编译错误。哪个编译器有这个函数可用?有什么详细信息吗?

0
0 Comments

如何在C和C++中使用ANSI Escape Codes来输出彩色文本?

问题的出现原因:

在某个时候,我创建了一个非常简单的文本管理库,它是跨平台的。对于Windows平台,它使用本地API调用,而对于其他平台则使用ANSI转义序列。该库已经完全文档化,并且您也可以浏览源代码。关于您的具体问题,我认为您可能缺少一些代码。例如,要更改文本的颜色,您应该使用类似以下的代码:

解决方法:

static const char * CSI = "\33[";
printf( "%s%s", CSI, "31m" );   // RED

但是,我猜在Windows cmd中,用于着色文本的ANSI转义序列只在DOS控制台上有效,而在Windows cmd中,它会打印出一些控制字符而不是彩色文本。

是的,在Windows命令控制台中,您必须使用Windows API调用。我给您指出的库可以自动化这个过程。

我几乎想建议在这种情况下使用预处理器宏,这样您可以将字符串编写为:

printf("Hello" COLOR_RED " World" COLOR_OFF);

这样可以方便地设置文本的颜色。

希望对您有所帮助。

文章结束

0
0 Comments

在Windows 10中,可以通过在当前控制台中激活VT100模式来使用VT100样式:

#include <windows.h>
#include <iostream>
#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
#define DISABLE_NEWLINE_AUTO_RETURN  0x0008
int main()
{       
   HANDLE handleOut = GetStdHandle(STD_OUTPUT_HANDLE);
   DWORD consoleMode;
   GetConsoleMode( handleOut , &consoleMode);
   consoleMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
   consoleMode |= DISABLE_NEWLINE_AUTO_RETURN;            
   SetConsoleMode( handleOut , consoleMode );
   for (int i = 0; i < 10; ++i)
   {
      std::cout << "\x1b[38;2;" << 5 * i << ";" << 255 - 10 * i << ";220m" 
             << "ANSI Escape Sequence " << i << std::endl;
   }
}

参考MSDN页面:[https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences][1]

原因:在Windows 10中,输出彩色文本的一种方法是使用ANSI Escape Codes。然而,默认情况下,Windows控制台不支持这些转义序列。因此,需要通过激活VT100模式来启用这些功能。

解决方法:在C++程序中,可以使用Windows API来激活VT100模式并使用ANSI Escape Codes输出彩色文本。以上代码片段展示了如何使用Windows API来实现这一目标。首先,通过调用GetStdHandle函数获取标准输出句柄,然后使用GetConsoleMode函数获取控制台模式。接下来,将ENABLE_VIRTUAL_TERMINAL_PROCESSING和DISABLE_NEWLINE_AUTO_RETURN标志位设置为控制台模式,并将其与consoleMode变量进行按位或操作。最后,使用SetConsoleMode函数将更新后的控制台模式应用于标准输出句柄。通过这些步骤,可以激活VT100模式并在程序中使用ANSI Escape Codes输出彩色文本。

[1]: https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences

0
0 Comments

这篇文章将讨论如何在C和C++中使用ANSI转义码输出带颜色的文本。在代码中,作者提到了一个问题,即忘记了转义字符ESC。然后,作者给出了解决该问题的方法。作者建议在printf函数中使用转义字符ESC来输出带颜色的文本。但是,这种方法只适用于支持ANSI转义序列的控制台(如使用bash的Linux控制台或使用ansi.sys的旧Windows控制台)。某些情况下这种方法在某些情况下不起作用,他们建议尝试其他答案。另外,还有另一种解决方法,即使用\xNN表示法来定义字符串中的ESC字符代码,其中NN是ESC符号的十六进制代码(0x1B等于十进制的27)。同时,作者还指出可以将字符串分成几个部分,以使代码更清晰。最后,作者提到Windows 10+现在也提供了类似的功能,但需要启用。整个控制台API都已过时。

0