为何调用C语言system("Title Something")可修复CMD的ANSI颜色显示?
CMD中ANSI颜色失效与
system("Title")的关联问题 开发命令行工具时发现一段必须保留的代码:
// 我必须保留这段代码,但不知道原因!!!! system("Title Something");
移除这段代码后,VS Code模拟控制台运行工具一切正常,但在CMD中,代码里的ANSI颜色全部失效。
测试验证
搭建测试项目验证现象:
无system语句的代码:
#include <stdio.h> int main(){ printf("\033[1;31mI am red!\033[0m"); }
CMD运行输出:
C:\tests\ANSI-test>hello ←[1;31mI am red!←[0m
添加system("Title Something");后的代码(需引入stdlib.h):
#include <stdio.h> #include <stdlib.h> int main(){ system("Title Something"); printf("\033[1;31mI am red!\033[0m"); }
此时CMD中ANSI颜色恢复正常:
C:\tests\ANSI-test>hello I am red! (假设此文本为红色)
原因推测
- system函数初始化了控制台相关组件,触发ANSI颜色生效
- system通过调用WinAPI让终端支持颜色显示
原理说明
从Windows 10 TH2版本开始,Windows控制台原生支持ANSI/VT100转义序列,但默认并未启用。当调用system("Title ...")时,该命令会间接调用WinAPI修改控制台属性,顺带开启了ANSI转义序列的支持——这就是添加这条语句后颜色恢复正常的原因。
如果不想依赖system("Title"),可以直接通过WinAPI手动启用ANSI支持:
#include <windows.h> #include <stdio.h> int main() { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); DWORD dwMode = 0; GetConsoleMode(hOut, &dwMode); dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; SetConsoleMode(hOut, dwMode); printf("\033[1;31mI am red!\033[0m"); return 0; }
内容的提问来源于stack exchange,提问作者Dimitur Karabuyukov
相关产品推荐
相关产品推荐

