是否有可能在纯 ANSI C 中为控制台输出着色?而不用外部库?这可以在 Windows、Linux 或 Mac OS X 上完成吗?
是的,在Linux/Mac中使用ANSI C89是可能的。 您可以操纵文本的字体和颜色。 使用以下命令:
printf("%c[0;00mHello, world!\n", 27); /* White color */
printf("%c[1;33mHello, world!\n", 27); /* Yellowish color */
printf("%c[1;34mHello, world!\n", 27); /* Blueish color */
#include <stdio.h>
#include <windows.h>
int main(void)
{
/* Point to our console */
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
int i = 0;
/* Iterate through colors */
for(; i < 255; i++)
{ /* i stands for color type: could refer to actual text color or background color of text */
SetConsoleTextAttribute(hConsole, i);
printf("Colorful text");
}
getchar();
return 0;
}
Good luck!
仅仅是普通的ANSI C吗?
不是的。C标准并没有假设stdout是控制台或带有颜色。
这能在Windows、Linux或Mac OS X中完成吗?
可以。请参见如何在Linux和Mac OS X上以跨平台方式在控制台中输出彩色文本?。
对于Windows,如果要避免使用外部库,则需要直接访问Console Functions。
虽然ISO C不知道控制台是否能够显示颜色,但是有一个基于转义字符控制的ANSI规范用于控制台功能管理。这在Linux和Mac OS X中透明地工作,但在Windows中失败,需要使用Win32 API的原语。
您可以在下面找到一个非常简单的库,它允许以多平台方式(Win32和类Unix系统)清除屏幕、显示颜色并定位光标到特定坐标。
它附带了纯C源文件(.c和.h)、西班牙语的doxygen文档(doc/)和一个简单的演示(main.c)。
在 POSIX 系统上,您可以使用 ANSI 转义序列。
在 Windows 上,情况会稍微复杂一些,有多种解决方案:
使用 Win32 API 在打印到控制台之前设置输出颜色,使用 SetConsoleTextAttribute 和 friends。这比简单地将 ANSI 转义序列嵌入字符串要麻烦得多,并需要您将 Windows 视为特例来处理。
旧版本的Windows中包含了ANSI.SYS,但在后续版本中已被移除。ANSICON是一个替代品,您可以安装它以在Windows命令提示符中获得ANSI颜色代码支持:https://github.com/adoxa/ansicon
这是一个可以轻松集成到任何现有项目中的项目,而无需依赖于已安装的ANSI.SYS或ANSICON。
它接受一个包含ANSI转义序列的字符串,并将其转换为相应的Win32等效API函数:https://github.com/mattn/ansicolor-w32.c