C语言控制台输出文本样式:字体、颜色及高级技巧322


C语言本身并不直接提供修改控制台输出字体样式的功能,不像一些高级语言(如Python)拥有丰富的库函数直接支持文本颜色和字体的改变。 然而,我们可以通过操作操作系统提供的API函数来实现类似的效果,从而在控制台输出中改变文本的颜色和一些基本的样式。本文将详细介绍如何在Windows和Linux/Unix系统下实现C语言控制台输出文本样式的修改,并探讨一些高级技巧。

一、Windows系统下的控制台文本样式修改

在Windows系统下,我们可以使用Windows API函数SetConsoleTextAttribute来修改控制台文本的颜色和样式。这个函数需要一个HANDLE类型的参数,代表控制台的句柄。我们可以通过GetStdHandle(STD_OUTPUT_HANDLE)获取标准输出句柄。

SetConsoleTextAttribute函数接受一个WORD类型的参数,这个参数是一个位掩码,用于指定文本的颜色和属性。颜色和属性的组合可以通过位运算来实现。以下是一些常用的颜色和属性值:
FOREGROUND_BLUE: 蓝色
FOREGROUND_GREEN: 绿色
FOREGROUND_RED: 红色
FOREGROUND_INTENSITY: 高亮度
BACKGROUND_BLUE: 蓝色背景
BACKGROUND_GREEN: 绿色背景
BACKGROUND_RED: 红色背景
BACKGROUND_INTENSITY: 高亮度背景

例如,要设置文本为红色高亮,背景为蓝色,可以使用以下代码:```c
#include
#include
int main() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
WORD wOldColorAttrs;
CONSOLE_SCREEN_BUFFER_INFO csbi;
// 获取当前控制台属性
GetConsoleScreenBufferInfo(hConsole, &csbi);
wOldColorAttrs = ;
// 设置文本为红色高亮,背景为蓝色
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_BLUE);
printf("This text is red with blue background!");
// 恢复原来的控制台属性
SetConsoleTextAttribute(hConsole, wOldColorAttrs);
printf("This text has the default color.");
return 0;
}
```

这段代码首先获取控制台句柄和当前属性,然后使用SetConsoleTextAttribute函数设置新的属性,最后恢复到原来的属性。记住始终恢复原来的属性,以避免影响后续的输出。

二、Linux/Unix系统下的控制台文本样式修改

在Linux/Unix系统下,可以使用ANSI转义码来修改控制台文本的颜色和样式。ANSI转义码是一些特殊的字符序列,可以被终端解释为控制指令。这些代码以\033[开头,以m结尾,中间部分是控制参数。

例如,要设置文本为红色,可以使用以下ANSI转义码:```
\033[31m
```

要重置文本颜色,可以使用以下ANSI转义码:```
\033[0m
```

以下是一些常用的ANSI转义码:
\033[30m: 黑色
\033[31m: 红色
\033[32m: 绿色
\033[33m: 黄色
\033[34m: 蓝色
\033[35m: 紫色
\033[36m: 青色
\033[37m: 白色
\033[1m: 加粗
\033[4m: 下划线
\033[0m: 重置

以下是一个在Linux/Unix系统下修改文本颜色的C语言示例:```c
#include
int main() {
printf("\033[31mThis text is red.\033[0m");
printf("\033[32mThis text is green.\033[0m");
printf("This text has the default color.");
return 0;
}
```

三、高级技巧:自定义函数和跨平台兼容性

为了提高代码的可读性和可维护性,我们可以编写自定义函数来封装颜色和样式的设置。 例如,可以创建一个函数来设置文本颜色:```c
#ifdef _WIN32
#include
void setTextColor(int color) {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, color);
}
#else
#include
void setTextColor(int color) {
printf("\033[%dm", 30 + color);
}
#endif
```

这个函数根据操作系统自动选择合适的实现方式,实现了跨平台的文本颜色设置。 使用预处理器宏#ifdef _WIN32和#else可以区分Windows和Linux/Unix系统。

通过结合这些技巧,我们可以创建更具视觉吸引力的C语言控制台程序,提升用户体验。 然而,需要注意的是,并非所有终端都完全支持ANSI转义码,在某些终端环境下,这些代码可能无法正确显示。

2025-04-21


上一篇:C语言浮点数输出格式控制详解:精确控制小数位数

下一篇:C语言输出对齐:空格、制表符及格式化输出详解