cprintf 不是标准 C 库函数,它不属于 C 语言标准(如 C89, C99, C11 等)的一部分。

(图片来源网络,侵删)
cprintf 是一个非常流行且实用的扩展函数,它主要用于嵌入式系统或控制台应用程序的开发中,尤其是在 Turbo C、Borland C++ 等老式的 DOS 编译器环境中非常常见,它的主要作用是向文本窗口(text window)输出格式化的字符串,而不仅仅是像 printf 那样输出到标准输出(通常是控制台屏幕)。
cprintf 是什么?
cprintf 的全称是 "Console Printf"(控制台格式化打印),它和 printf 的功能几乎完全相同,都使用格式化字符串来输出数据,但关键区别在于 printf 输出到整个屏幕,而 cprintf 输出到一个活动的文本窗口中。
cprintf 与 printf 的核心区别
| 特性 | printf |
cprintf |
|---|---|---|
| 所属库 | 标准C库 (<stdio.h>) |
扩展库 (<conio.h>) |
| 输出目标 | 标准输出流,通常是整个控制台屏幕 | 活动的文本窗口 |
| 窗口控制 | 无,直接在屏幕上光标位置输出 | 可以通过 window() 函数创建和控制 |
| 光标移动 | 不自动移动光标 | 输出后光标会自动移动到下一个位置 |
| 跨平台性 | 极高,所有C环境都支持 | 很低,主要在DOS、Windows控制台、某些嵌入式系统中支持 |
printf像用记号笔在一张大白纸上画画。cprintf像在一个用相框框起来的小画板上画画,你可以移动这个画板(window()函数),但画的内容不会超出画板范围。
如何使用 cprintf (示例)
要使用 cprintf,你需要包含头文件 <conio.h>。

(图片来源网络,侵删)
示例 1:基本用法
这个例子展示了 cprintf 和 printf 的基本区别。
#include <stdio.h> // 用于 printf
#include <conio.h> // 用于 cprintf, window, textcolor, textbackground
int main() {
// 1. 使用 printf 输出到整个屏幕
printf("This is a message from printf. It will appear at the top of the screen.\n");
printf("It can overwrite anything on the screen.\n");
// 2. 使用 window() 函数创建一个文本窗口
// window(x1, y1, x2, y2)
// (x1,y1) 是窗口左上角坐标, (x2,y2) 是右下角坐标
// 整个屏幕的坐标是 (1, 1) 到 (80, 25) 或更宽
window(10, 5, 70, 15); // 创建一个从第5行第10列到第15行第70列的窗口
// 3. 设置窗口内文本的背景色和前景色
textcolor(WHITE); // 设置文本颜色为白色
textbackground(BLUE); // 设置背景颜色为蓝色
// 4. 使用 cprintf 在这个窗口内输出
cprintf("This is a message from cprintf.\n");
cprintf("This text is confined within the window we just created.\n");
cprintf("You can't see this text outside the blue area.\n");
// 5. 改变窗口内的颜色
textcolor(YELLOW);
textbackground(RED);
cprintf("Now the text color and background have changed!\n");
// 6. 按任意键退出
printf("\n\nPress any key to exit...");
getch(); // 从 conio.h,等待用户按键
return 0;
}
代码解释:
#include <conio.h>:包含了cprintf、window、textcolor等函数的声明。window(10, 5, 70, 15);:这是使用cprintf的前提,它定义了一个文本区域,之后所有cprintf的输出都会被限制在这个区域内。textcolor(WHITE);和textbackground(BLUE);:设置后续cprintf输出文本的颜色和背景色。cprintf(...):与printf用法完全一样,但输出被限制在window定义的区域内。
cprintf 的相关函数
cprintf 通常与 <conio.h> 中的其他函数配合使用,以实现强大的控制台界面效果。
| 函数 | 功能 | 示例 |
|---|---|---|
window(x1, y1, x2, y2) |
定义一个文本输出窗口。 | window(5, 5, 50, 20); |
textcolor(color) |
设置文本(前景色)颜色。 | textcolor(RED); |
textbackground(color) |
设置文本背景颜色。 | textbackground(BLACK); |
clrscr() |
清除整个屏幕,并将光标移到左上角。 | clrscr(); |
clreol() |
清除从光标位置到行尾的所有字符。 | clreol(); |
gotoxy(x, y) |
将光标移动到屏幕(或窗口)的指定位置。 | gotoxy(1, 1); |
getch() |
从键盘读取一个字符,但不显示在屏幕上。 | char ch = getch(); |
getche() |
从键盘读取一个字符,并显示在屏幕上。 | char ch = getche(); |
现代 C 语言中的替代方案
在现代 C/C++ 开发中,我们很少使用 cprintf,因为它不是标准的,并且主要面向 DOS 环境,如果你想在现代操作系统(如 Windows, Linux, macOS)的终端或控制台程序中实现类似的功能,有以下几种替代方案:

(图片来源网络,侵删)
在 Windows 控制台程序中使用
Windows API 提供了丰富的控制台操作函数,可以实现 cprintf 的所有功能,甚至更多。
#include <stdio.h>
#include <windows.h> // Windows API头文件
int main() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
// 1. 设置控制台窗口大小(模拟 window 函数)
// COORD size = {80, 25}; // 宽度80,高度25
// SetConsoleScreenBufferSize(hConsole, size);
// SMALL_RECT rect = {0, 0, 79, 24};
// SetConsoleWindowInfo(hConsole, TRUE, &rect);
// 2. 设置文本颜色(模拟 textcolor 和 textbackground)
// 颜色值是 FOREGROUND_RED, FOREGROUND_GREEN 等的组合
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | BACKGROUND_GREEN);
printf("This text is red on green.\n");
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | BACKGROUND_INTENSITY);
printf("This text is bright blue on default background.\n");
// 3. 设置光标位置(模拟 gotoxy)
COORD pos;
pos.X = 10;
pos.Y = 10;
SetConsoleCursorPosition(hConsole, pos);
printf("Cursor is now at (10, 10).\n");
// 4. 清屏(模拟 clrscr)
system("cls"); // 调用系统命令 cls
return 0;
}
跨平台库(如 ncurses)
如果你需要编写跨平台的控制台UI程序,ncurses 是一个绝佳的选择,它在 Linux, macOS, Windows (通过 PDCurses) 上都能工作。
// ncurses 示例 (Linux/macOS)
#include <ncurses.h>
int main() {
initscr(); // 初始化 ncurses 模式
cbreak(); // 禁用行缓冲
noecho(); // 不显示输入的字符
// 1. 设置颜色(需要先启动颜色)
start_color();
init_pair(1, COLOR_RED, COLOR_GREEN); // 定义颜色对1:红字绿底
attron(COLOR_PAIR(1));
mvprintw(5, 5, "This text is red on green.");
attroff(COLOR_PAIR(1));
// 2. 设置光标位置
mvprintw(10, 10, "Cursor is now at (10, 10).");
refresh(); // 刷新屏幕,显示所有变化
getch(); // 等待用户按键
endwin(); // 结束 ncurses 模式,恢复终端正常状态
return 0;
}
| 特性 | cprintf |
现代替代方案 |
|---|---|---|
| 定位 | 嵌入式/复古DOS开发 | 现代 C/C++ 开发 |
| 标准性 | 非标准,依赖特定编译器/平台 | 标准 (Windows API) 或 跨平台 (ncurses) |
| 功能 | 简单的窗口和颜色控制 | 功能极其强大,可构建复杂UI |
| 学习价值 | 了解历史和嵌入式概念 | 掌握实际工作中的技能 |
- 如果你正在学习 Turbo C 或进行一些复古编程,或者在某些特定的嵌入式开发环境(如某些单片机IDE)中,
cprintf是一个非常有用且方便的工具。 - 如果你正在进行现代的、跨平台的 C/C++ 项目,你应该避免使用
cprintf,你应该使用Windows API(针对Windows平台)或 ncurses(针对跨平台)等现代、标准化的库来实现控制台界面的功能。
