当前位置: 代码网 > it编程>编程语言>C/C++ > C++ ANSI真彩色函数的实现

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

2026年09月18日 C/C++ 我要评论
上期我们聊了 system("color")、setconsoletextattribute 和基础 ansi 转义码,今天单独拎出 ansi 里最实用的 真彩色(true col

上期我们聊了 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真彩色函数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com