textattr 是一个非标准的、过时的函数,主要用于在DOS 环境(如 MS-DOS, Turbo C, Borland C++ 等)下的文本模式终端中设置文本属性,包括颜色和亮度。

重要提示:现代环境不适用
在今天的现代操作系统(如 Windows 10/11, macOS, Linux)中,textattr 函数是无法使用的,这些系统使用图形界面(GUI)或复杂的终端模拟器(如 Windows Terminal, macOS Terminal, xterm),它们有自己的方式来控制文本颜色和样式(通常是 ANSI 转义码)。
textattr 是学习计算机历史和 DOS 编程时遇到的一个函数,如果你正在学习现代 C 语言开发,请直接跳到文末的“现代替代方案”部分。
textattr 函数简介
textattr 函数定义在头文件 <conio.h> 中。conio.h (Console Input/Output) 是一个专用于 DOS 环境的控制台 I/O 头文件,在标准 C 库中并不存在。
函数原型:

void textattr(int attribute);
功能: 设置后续所有文本输出的显示属性,这个属性是一个组合值,它同时决定了:
- 前景色:字符本身的颜色。
- 背景色:字符所在位置背景的颜色。
- 闪烁:字符是否闪烁。
属性值的构成
textattr 的参数 attribute 是一个 8 位的整数,其每一位都有特定的含义:
| 位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 含义 | 闪烁 | 背景色 (高亮位) | 背景色 | 前景色 (高亮位) | 前景色 |
- 位 0-3 (低4位): 前景色
- 位 4-6: 背景色
- 位 7: 闪烁标志
- 位 3 和 位 6: 分别是前景色和背景色的高亮/加粗标志。
颜色常量
我们使用 <conio.h> 中定义的宏来组合颜色,而不是直接写数字。
| 颜色 | 值 (前景色) | 值 (背景色) |
|---|---|---|
| 黑色 | BLACK (0) |
BLACK (0) |
| 蓝色 | BLUE (1) |
BLUE (16) |
| 绿色 | GREEN (2) |
GREEN (32) |
| 青色 | CYAN (3) |
CYAN (48) |
| 红色 | RED (4) |
RED (64) |
| 洋红 | MAGENTA (5) |
MAGENTA (80) |
| 棕色 | BROWN (6) |
BROWN (96) |
| 浅灰 | LIGHTGRAY (7) |
LIGHTGRAY (112) |
高亮/加亮颜色 (前景色):
| 颜色 | 值 |
| :--- | :--- |
| 深灰 | DARKGRAY (8) |
| 亮蓝 | LIGHTBLUE (9) |
| 亮绿 | LIGHTGREEN (10) |
| 亮青 | LIGHTCYAN (11) |
| 亮红 | LIGHTRED (12) |
| 亮洋红 | LIGHTMAGENTA (13) |
| 黄色 | YELLOW (14) |
| 白色 | WHITE (15) |

闪烁标志
要启用闪烁,需要将 BLINK (128) 与颜色值进行 按位或 (OR) 运算。
如何组合属性
组合属性的基本公式是:
attribute = (背景色值) | (前景色值);
或者更具体地:
attribute = (背景色 & 0x70) | (前景色 & 0x0F);
前景色 & 0x0F确保只使用前景色的低4位。背景色 & 0x70确保只使用背景色的中间3位(第4,5,6位)。
示例:
-
绿色前景,黑色背景
GREEN是 2,BLACK是 0。textattr(GREEN | BLACK);// 结果是 2 -
红色前景,蓝色背景
RED是 4,BLUE是 16。textattr(RED | BLUE);// 结果是 20 (4 | 16 = 20) -
白色前景,棕色背景,高亮显示
WHITE是 15,BROWN是 96。textattr(WHITE | BROWN);// 结果是 111 (15 | 96 = 111) -
黄色前景,黑色背景,闪烁
YELLOW是 14,BLACK是 0,BLINK是 128。textattr(YELLOW | BLACK | BLINK);// 结果是 142 (14 | 0 | 128 = 142)
完整的 DOS 示例代码
这个代码只能在支持 <conio.h> 的旧式编译器(如 Turbo C++ 3.0)上运行。
#include <stdio.h>
#include <conio.h> // 必须包含此头文件
int main() {
// 1. 设置绿色前景,黑色背景
textattr(GREEN);
cprintf("This is green text on a black background.\n");
// 2. 设置红色前景,蓝色背景
textattr(RED | BLUE);
cprintf("This is red text on a blue background.\n");
// 3. 设置白色前景,棕色背景,并高亮
textattr(WHITE | BROWN);
cprintf("This is white text on a brown background (bright).\n");
// 4. 设置黄色前景,黑色背景,并闪烁
textattr(YELLOW | BLACK | BLINK);
cprintf("This is yellow text on a black background (BLINKING!).\n");
// 5. 恢复默认属性(通常是灰色前景,黑色背景)
textattr(LIGHTGRAY | BLACK);
cprintf("\nBack to default settings.\n");
getch(); // 等待用户按一个键,防止窗口闪退
return 0;
}
代码说明:
cprintf(): 是conio.h中的函数,类似于printf,但直接输出到文本模式的控制台。getch(): 也是conio.h中的函数,等待用户输入一个字符且不回显。
现代替代方案:ANSI 转义码
在 Windows, macOS 和 Linux 的现代终端中,我们使用 ANSI 转义码 来控制颜色和样式,这些是嵌入在字符串中的特殊字符序列。
基本格式:
"\033[<代码>m"
\033是转义字符(ASCII 码 27)。[是开始标记。<代码>是具体的样式或颜色代码。m是结束标记。
颜色代码:
| 颜色 | 前景色代码 | 背景色代码 |
|---|---|---|
| 黑色 | 30 | 40 |
| 红色 | 31 | 41 |
| 绿色 | 32 | 42 |
| 黄色 | 33 | 43 |
| 蓝色 | 34 | 44 |
| 洋红 | 35 | 45 |
| 青色 | 36 | 46 |
| 白色 | 37 | 47 |
样式代码: | 样式 | 代码 | | :--- | :--- | | 重置所有样式 | 0 | | 高亮/加粗 | 1 | | 斜体 | 3 (支持度不一) | | 下划线 | 4 | | 闪烁 | 5 | | 反色(前景变背景,背景变前景)| 7 | | 隐藏 | 8 |
现代 C 语言示例:
这个代码可以在任何现代 C 编译器(如 GCC, Clang, MSVC)上运行,只要你在支持 ANSI 转义码的终端(如 Windows Terminal, VS Code 内置终端)中执行它。
#include <stdio.h>
int main() {
// 1. 绿色前景,黑色背景
printf("\033[32mThis is green text on a black background.\033[0m\n");
// 2. 红色前景,蓝色背景
printf("\033[31;44mThis is red text on a blue background.\033[0m\n");
// 3. 白色前景,棕色背景,并高亮
printf("\033[1;37;43mThis is white text on a brown background (bright).\033[0m\n");
// 4. 黄色前景,黑色背景,并闪烁
printf("\033[33;5mThis is yellow text on a black background (BLINKING!).\033[0m\n");
// 5. 重置所有样式,确保后续输出正常
printf("\nBack to default settings.\n");
return 0;
}
代码说明:
\033[0m是重置代码,非常重要!它会把终端的显示属性恢复到默认状态,避免影响后续的文本输出。- 代码可以组合,
\033[1;31;44m同时设置了高亮(1)、红色前景(31)和蓝色背景(44)。
| 特性 | textattr (DOS) |
ANSI 转义码 (现代) |
|---|---|---|
| 环境 | DOS (过时) | Windows, macOS, Linux (现代) |
| 头文件 | <conio.h> (非标准) |
无需特殊头文件 |
| 方法 | 调用函数设置全局属性 | 在字符串中嵌入特殊序列 |
| 重置 | textattr(LIGHTGRAY \| BLACK) |
\033[0m |
| 适用性 | 仅用于学习或复古项目 | 所有现代终端应用开发 |
除非你有特殊的复古编程需求,否则请务必学习和使用 ANSI 转义码 来为你的现代 C 程序添加彩色输出。
