ANSI C 中的颜色控制台?

问题描述 投票:0回答:5

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

c console colors
5个回答
8
投票

只是简单的 ANSI C?

不。 C 标准不假设标准输出是控制台或有颜色。

这可以在 Windows、Linux 或 Mac OS X 中完成吗?

是的。请参阅如何以跨平台方式在 Mac OS X 上以彩色方式打印到控制台?(适用于 Linux 和 Mac OS X)。

对于 Windows,如果您想避免外部库,您可能需要直接访问控制台功能


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;
}

祝你好运!


0
投票

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


0
投票

Linux/OSX/Unix

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

Windows

在Windows上有点复杂,有多种解决方案:

Win32 API

使用 Win32 API 设置输出颜色,然后使用 SetConsoleTextAttribute friends 打印到控制台。这比简单地在字符串中嵌入 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


0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.