C++ ANSI真彩色函数的实现

 更新时间:2026年09月18日 09:29:32   作者:ziguo1122  
本文主要介绍了C++ ANSI真彩色函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

上期我们聊了 system("color")、SetConsoleTextAttribute 和基础 ANSI 转义码,今天单独拎出 ANSI 里最实用的 真彩色(True Color) 玩法——直接传 RGB,想要什么颜色就有什么颜色。

一、为什么还要专门写个函数?

基础 ANSI 码只支持 16 种颜色(30~37 / 90~97),虽然够用,但想调个橙红、粉紫、蒂芙尼蓝就抓瞎了。
真彩色(24-bit)允许你用 R(0~255) G(0~255) B(0~255) 精确控制,公式是:

  • 前景色:\033[38;2;R;G;Bm
  • 背景色:\033[48;2;R;G;Bm

每次手动拼字符串太麻烦,封装成函数最省事。

二、核心函数(直接复制就能用)

#include <string>

std::string rgb(int r, int g, int b, bool bg = false) {
    // 防手滑越界
    if (r < 0) r = 0; if (r > 255) r = 255;
    if (g < 0) g = 0; if (g > 255) g = 255;
    if (b < 0) b = 0; if (b > 255) b = 255;

    int prefix = bg ? 48 : 38;   // 48=背景,38=前景
    return "\033[" + std::to_string(prefix) + ";2;" +
           std::to_string(r) + ";" +
           std::to_string(g) + ";" +
           std::to_string(b) + "m";
}

// 顺手一个重置
inline std::string reset() { return "\033[0m"; }

三、怎么用?三步走

#include <iostream>

int main() {
    // 1. 设置文字颜色(橙红)
    std::cout << rgb(255, 100, 50) << "这行是橙红色" << reset() << std::endl;

    // 2. 设置背景色(天蓝)
    std::cout << rgb(0, 150, 255, true) << "  蓝底白字  " << reset() << std::endl;

    // 3. 同时设前景和背景(黄字黑底)
    std::cout << rgb(255, 255, 0) << rgb(0, 0, 0, true)
              << "黄字黑底" << reset() << std::endl;

    return 0;
}
  • 前三个参数是 RGB,范围 0~255。
  • 第四个参数 bg 默认为 false(文字色),设为 true 就是背景色。
  • 每段颜色输出后记得调用 reset(),否则后续输出会“继承”颜色。

四、几个避坑提醒

常见问题解决方法
终端不支持真彩色(老 Windows cmd)换用 Windows Terminal、PowerShell 7+,或 Linux/macOS 自带终端。
Windows 下输出乱码程序开头必须开启 VT 模式(见上期文章)。
重定向到文件出现乱码用 isatty() 判断,非终端环境就别输出转义码。
只想重置颜色,保留粗体/下划线用 \033[39m(前景)或 \033[49m(背景)代替 \033[0m。

五、和基础 ANSI 比,好在哪?

对比项基础 ANSI(16色)真彩色(RGB)
颜色数量固定 16 种1670 万种(任意 RGB)
语法\033[31m\033[38;2;R;G;Bm
兼容性几乎所有终端需要较新终端(Win10+ / Linux / macOS)
适用场景通用、老旧环境追求美观、个性化输出

六、完整测试代码

把上面的函数和 main 合在一起,就是一份可直接编译运行的完整例子:

#include <iostream>
#include <string>

std::string rgb(int r, int g, int b, bool bg = false) {
    if (r < 0) r = 0; if (r > 255) r = 255;
    if (g < 0) g = 0; if (g > 255) g = 255;
    if (b < 0) b = 0; if (b > 255) b = 255;
    int prefix = bg ? 48 : 38;
    return "\033[" + std::to_string(prefix) + ";2;" +
           std::to_string(r) + ";" +
           std::to_string(g) + ";" +
           std::to_string(b) + "m";
}

inline std::string reset() { return "\033[0m"; }

int main() {
    std::cout << rgb(255, 80, 80) << "红色警告" << reset() << std::endl;
    std::cout << rgb(80, 255, 80) << "绿色成功" << reset() << std::endl;
    std::cout << rgb(255, 255, 80) << "黄色提示" << reset() << std::endl;
    std::cout << rgb(255, 165, 0) << "橙色自定义" << reset() << std::endl;
    std::cout << rgb(0, 0, 0, true) << rgb(255, 255, 255)
              << "黑底白字" << reset() << std::endl;
    return 0;
}

小结

这个函数只有短短几行,却让你彻底告别 16 色限制。配合上期的基础知识,现在你可以在 Windows/Linux/macOS 下自由调配控制台色彩了。
如果终端不支持,别慌——换 Windows Terminal 或直接用 Linux,效果立竿见影。

到此这篇关于C++ ANSI真彩色函数的实现的文章就介绍到这了,更多相关C++ ANSI真彩色函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++读取注册表的实现方法

    C++读取注册表的实现方法

    这篇文章主要介绍了C++读取注册表的实现方法的相关资料,希望通过本文能帮助到大家,让大家理解掌握实现这样的功能,需要的朋友可以参考下
    2017-10-10
  • VC++中HTControl的CHTButton按钮控件类用法实例解析

    VC++中HTControl的CHTButton按钮控件类用法实例解析

    这篇文章主要介绍了VC++中HTControl的CHTButton按钮控件类用法,对于大家进行VC++项目开发有一定的帮助作用,需要的朋友可以参考下
    2014-08-08
  • C++ STL array容器访问元素的几种方式

    C++ STL array容器访问元素的几种方式

    这篇文章主要介绍了C++ STL array容器访问元素的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 基于一致性hash算法 C++语言的实现详解

    基于一致性hash算法 C++语言的实现详解

    在《基于一致性hash算法(consistent hashing)的使用详解》一文中已经介绍了一致性hash的基本原理,本文将会对其具体实现细节进行描述,并用c++语言对一致性hash进行了简单的实现
    2013-05-05
  • C语言实现素因子分解

    C语言实现素因子分解

    这篇文章主要为大家详细介绍了C语言实现素因子分解,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • 深入解析C++中的std::thread的使用

    深入解析C++中的std::thread的使用

    这篇文章主要介绍了C++中的std::thread的使用,在C++11新标准中,可以简单通过使用thread库,来管理多线程,本文通过实例代码给大家详细讲解,需要的朋友可以参考下
    2023-04-04
  • QT编写地图实现在线轮廓图的示例代码

    QT编写地图实现在线轮廓图的示例代码

    轮廓图也叫行政区划,这里的轮廓图是指百度地图的区域轮廓图。本文将为大家介绍QT如何实现在线轮廓图的编写,感兴趣的小伙伴可以跟随小编一起学习一下
    2021-12-12
  • C++命名空间和缺省参数介绍

    C++命名空间和缺省参数介绍

    这篇文章主要介绍了C++命名空间和缺省参数,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的,缺省参数是声明或定义函数时为函数的参数指定一个默认值,更多详细内容需要的小伙伴可以参考下面文章内容
    2022-01-01
  • C++实现“隐藏实现,开放接口”的方案

    C++实现“隐藏实现,开放接口”的方案

    本文从一个实例讲解了C++实现“隐藏实现,开放接口”的方案,文章条理清新,内容充实,需要的朋友可以参考下
    2015-07-07
  • c语言实现的带通配符匹配算法

    c语言实现的带通配符匹配算法

    这篇文章主要介绍了c语言实现的带通配符匹配算法,需要的朋友可以参考下
    2015-03-03

最新评论