Windows平台

控制光标定位

Windows环境下可以通过调用WIN32 API来实现光标定位,具体实现如下:

#include <windows.h>
void gotoxy(int x, int y) {
    COORD cursorPosition;
    cursorPosition.X = x;
    cursorPosition.Y = y;
    // COORD cursorPosition = {x, y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPosition);
}

注意:X, Y 的值都是从 0 开始的。

隐藏光标

有了光标定位的基础,只需要将光标定位于控制台之外的为,便可以实现隐藏光标,例如,通过上文中实现的gotoxy函数将光标定位于(-1, -1) 位置便可以实现隐藏光标。

清屏

Windows环境下可以通过执行cls命令来实现清屏,具体实现如下:

#include <windows.h>
void clear() {
    system("cls");
}

color命令

在cmd命令行中执行 color /?,可以得到color命令的用法如下:

设置默认的控制台前景和背景颜色。
COLOR [attr]
    attr        指定控制台输出的颜色属性
颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为
前景。每个数字可以为以下任何值之一:

    0 = 黑色       8 = 灰色
    1 = 蓝色       9 = 淡蓝色
    2 = 绿色       A = 淡绿色
    3 = 浅绿色     B = 淡浅绿色
    4 = 红色       C = 淡红色
    5 = 紫色       D = 淡紫色
    6 = 黄色       E = 淡黄色
    7 = 白色       F = 亮白色

如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时
的颜色。这个值来自当前控制台窗口、/T 命令行开关或 
DefaultColor 注册表值。

如果用相同的前景和背景颜色来执行 COLOR 命令,COLOR 命令
会将 ERRORLEVEL 设置为 1。

例如: "COLOR fc" 在亮白色上产生亮红色

程序中,也可以通过 system("color ... ") 调用color命令来实现改变控制台颜色的功能。

彩色输出

在Windows环境下,同样是通过调用WIN32 API来实现控制台程序的彩色输出。具体实现如下:

#include <windows.h>
void settextcolor(int color)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}

其中,color的值定义在 wincon.h 中。多个颜色值可以综合在一起使用。具体颜色定义如下:

#define FOREGROUND_BLUE	1
#define FOREGROUND_GREEN	2
#define FOREGROUND_RED	4
#define FOREGROUND_INTENSITY	8
#define BACKGROUND_BLUE	16
#define BACKGROUND_GREEN	32
#define BACKGROUND_RED	64
#define BACKGROUND_INTENSITY	128

多个值综合使用示例:(本质上为多个值得或运算)

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 
        FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY);

便可以在控制台将输出字符的颜色设置为黄色。

Linux 平台

控制光标定位

Linux环境下,控制台会解释ANSI转义序列,转义符是ESC,ASCII码为0x1b,因此,可以通过在中断输出转义序列来实现光标的定位,具体序列如下:

Esc[Line;Columnf

Esc[Line;ColumnH

应用举例:

void gotoxy(int x, int y) {
    printf("%c[%d;%df", 0x1b, y, x);
    // printf("%c[%d;%dH", 0x1b, y, x);
}

注意: 光标位置的行和列都是从 0 开始索引。

转义序列列表:

  • Esc[PnA 光标向上移动Pn行,如果光标已经处于最上方(the top line),则忽略该转义序列。
  • Esc[PnB 光标向下移动Pn行,如果光标已经处于最下方(the buttom line),则忽略该转义序列。
  • Esc[PnC 光标向右移动Pn行,如果光标已经处于最右处(the rightmost column),则忽略该转义序列。
  • Esc[PnD 光标向左移动Pn行,如果光标已经处于最左处(the leftmost column),则忽略该转义序列。
  • Esc[s 保存当前光标位置,之后可以通过恢复光标位置的转义序列回到被保存的光标位置。
  • Esc[u 恢复光标位置,将光标置于 Esc[s 序列保存的光标位置。
  • Esc[2J 清屏,将光标置于(0, 0)处(第一行第一列)。
  • Esc[K 删除从光标所在位置至当前行行末的所有字符,包括当前光标所在位置处的字符。
  • Esc[?25l 隐藏光标。
  • Esc[?25h 显示光标。

设置输出字符颜色

同样,也可以通过输出控制符来控制输出字符的颜色,用法如下:

  • Esc[Ps;Psm 设置图形模式(Set Graphics Mode)。第一个Ps的值为前景色的值,第二个Ps的值为背景色的值。

背景色的颜色值范围为40~49,前景色的颜色值范围为30-39,具体颜色值如下:

Color Background Foreground
black 40 30
red 41 31
green 42 32
yellow 43 33
blue 44 34
purple 45 35
deep green 46 36
white 47 37

例如,echo -e "\e[1;42m"表示将背景色设置为green,而echo -e "\e[1;32m表示将前景色设置为green.

其他转义序列控制

  • Esc[0m 关闭所有属性。
  • Esc[1m 设置高亮度。
  • Esc[4m 下划线。
  • Esc[5m 闪烁。
  • Esc[7m 反显。
  • Esc[8m 消隐。