【发布时间】:2011-03-17 12:46:50
【问题描述】:
是否可以用普通的 ANSI C 为控制台输出着色?没有外部库?这可以在 Windows、Linux 或 Mac OS X 中完成吗?
【问题讨论】:
是否可以用普通的 ANSI C 为控制台输出着色?没有外部库?这可以在 Windows、Linux 或 Mac OS X 中完成吗?
【问题讨论】:
只是普通的 ANSI C?
没有。 C 标准不假定标准输出是控制台或有颜色。
这可以在 Windows、Linux 或 Mac OS X 中完成吗?
是的。对于 Linux 和 Mac OS X,请参阅 How can I print to the console in color on Mac OS X in a cross-platform manner?。
对于 Windows,如果您想避免使用外部库,可能需要直接访问 Console Functions。
【讨论】:
如果您知道特定于 shell 的控制代码/转义序列,则可以在 Linux 中完成此操作。
【讨论】:
的确,ISO C 对控制台能够显示颜色一无所知,但是基于转义字符控件的控制台功能管理有一个 ANSI 规范。这在 Linux 和 Mac OS X 中透明地工作,但在 Windows 中失败,您需要使用 Win32 API 的原语。
您可以在下面找到一个非常简单的库,该库允许以多平台方式(Win32 和类 Unix 系统)清除屏幕、显示颜色并在特定坐标中定位光标。
它带有纯 C 源文件(.c 和 .h)、西班牙语的 doxygen 文档 (doc/) 和一个简单的演示 (main.c)
【讨论】:
是的,在 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 */
注意“;”的左边部分(其中数字 0、1 是)操纵文本字体, “;”的右边部分操纵颜色。您可以自行试验并找出新的颜色。
此代码使用"-ansi -pedantic" 命令编译,没有警告也没有错误。
***** 编辑 ***** 在基于 Windows 的系统中,您可以使用以下示例实现彩色控制台文本/文本背景:
#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;
}
祝你好运!
【讨论】:
在 posix 系统上,您可以使用 ANSI escape sequences。
在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
【讨论】: