cprintf函数如何在C语言中实现格式化输出?

99ANYc3cd6
预计阅读时长 19 分钟
位置: 首页 C语言 正文

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

c语言 cprintf
(图片来源网络,侵删)

cprintf 是一个非常流行且实用的扩展函数,它主要用于嵌入式系统控制台应用程序的开发中,尤其是在 Turbo CBorland C++ 等老式的 DOS 编译器环境中非常常见,它的主要作用是向文本窗口(text window)输出格式化的字符串,而不仅仅是像 printf 那样输出到标准输出(通常是控制台屏幕)。


cprintf 是什么?

cprintf 的全称是 "Console Printf"(控制台格式化打印),它和 printf 的功能几乎完全相同,都使用格式化字符串来输出数据,但关键区别在于 printf 输出到整个屏幕,而 cprintf 输出到一个活动的文本窗口中。

cprintfprintf 的核心区别

特性 printf cprintf
所属库 标准C库 (<stdio.h>) 扩展库 (<conio.h>)
输出目标 标准输出流,通常是整个控制台屏幕 活动的文本窗口
窗口控制 无,直接在屏幕上光标位置输出 可以通过 window() 函数创建和控制
光标移动 不自动移动光标 输出后光标会自动移动到下一个位置
跨平台性 极高,所有C环境都支持 很低,主要在DOS、Windows控制台、某些嵌入式系统中支持

  • printf 像用记号笔在一张大白纸上画画。
  • cprintf 像在一个用相框框起来的小画板上画画,你可以移动这个画板(window() 函数),但画的内容不会超出画板范围。

如何使用 cprintf (示例)

要使用 cprintf,你需要包含头文件 <conio.h>

c语言 cprintf
(图片来源网络,侵删)

示例 1:基本用法

这个例子展示了 cprintfprintf 的基本区别。

#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;
}

代码解释:

  1. #include <conio.h>:包含了 cprintfwindowtextcolor 等函数的声明。
  2. window(10, 5, 70, 15);:这是使用 cprintf 的前提,它定义了一个文本区域,之后所有 cprintf 的输出都会被限制在这个区域内。
  3. textcolor(WHITE);textbackground(BLUE);:设置后续 cprintf 输出文本的颜色和背景色。
  4. 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)的终端或控制台程序中实现类似的功能,有以下几种替代方案:

c语言 cprintf
(图片来源网络,侵删)

在 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(针对跨平台)等现代、标准化的库来实现控制台界面的功能。
-- 展开阅读全文 --
头像
c语言nullgets
« 上一篇 04-20
织梦数据库索引如何优化查询效率?
下一篇 » 04-20

相关文章

取消
微信二维码
支付宝二维码

目录[+]