ANSI C中的彩色控制台?

7

是否有可能在纯 ANSI C 中为控制台输出着色?而不用外部库?这可以在 Windows、Linux 或 Mac OS X 上完成吗?


这个SO问题可以为您提供更多信息。您应该检查不同颜色的颜色代码。还要小心重置为默认值。您只需使用不同的颜色代码格式化输出日志即可。[链接1](https://dev59.com/8HE95IYBdhLWcg3wV8a_)。 [链接2](https://dev59.com/yHA75IYBdhLWcg3wlqAT) - Praveen S
5个回答

8

是的,在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;
}

Good luck!


这个答案适用于Linux和Mac,但不适用于Windows,因为提问者要求。好吧,除非你在Windows xp启动时加载了ansi.sys模块(在Windows Vista及以上版本上无法使用)。 - Baltasarq
@Baltasarq,谢谢您的提醒!我已经更新了我的评论,以便也适用于Windows操作系统! - Ron

8

嗯,在某种程度上,Windows API 也是一个外部库,只不过是一个相当庞大的库。而终端转义序列则是它们自己的 API,只是使用起来非常棘手;-) - Joey
2
你链接的答案排除了Windows! - Tomáš Zato
@Joey Windows API 是一个外部库,也是一个系统库! - undefined

0
在Linux中,如果您知道特定于Shell的控制代码/转义序列,则可以完成此操作。

这些与 shell 没有任何关系。 - Joey
如果您在标准的sh(不是bash,不是csh,不是zsh)上使用Praveen在Link1中发布的代码[抱歉,我在我的回答中想写Unix而不是Linux],您将得到您所写的“控制码”,而不是您想要的“颜色”。 - Peter Miehle

0

虽然ISO C不知道控制台是否能够显示颜色,但是有一个基于转义字符控制的ANSI规范用于控制台功能管理。这在Linux和Mac OS X中透明地工作,但在Windows中失败,需要使用Win32 API的原语。

您可以在下面找到一个非常简单的库,它允许以多平台方式(Win32和类Unix系统)清除屏幕、显示颜色并定位光标到特定坐标。

它附带了纯C源文件(.c和.h)、西班牙语的doxygen文档(doc/)和一个简单的演示(main.c)。

http://github.com/Baltasarq/cscrutil/


啊呵,链接挂了,伙计! - Alex Gray

0

Linux/OSX/Unix

在 POSIX 系统上,您可以使用 ANSI 转义序列

Windows

在 Windows 上,情况会稍微复杂一些,有多种解决方案:

Win32 API

使用 Win32 API 在打印到控制台之前设置输出颜色,使用 SetConsoleTextAttributefriends。这比简单地将 ANSI 转义序列嵌入字符串要麻烦得多,并需要您将 Windows 视为特例来处理。

Windows ANSI.SYS 和替代品

旧版本的Windows中包含了ANSI.SYS,但在后续版本中已被移除。ANSICON是一个替代品,您可以安装它以在Windows命令提示符中获得ANSI颜色代码支持:https://github.com/adoxa/ansicon

可嵌入无外部依赖解决方案

这是一个可以轻松集成到任何现有项目中的项目,而无需依赖于已安装的ANSI.SYS或ANSICON。

它接受一个包含ANSI转义序列的字符串,并将其转换为相应的Win32等效API函数:https://github.com/mattn/ansicolor-w32.c


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接