C语言*NIX控制台下控制光标位置与文字颜色
本文完整阅读约需 6 分钟,如时间较长请考虑收藏后慢慢阅读~
众所周知,Win32下有非常多的命令行光标控制函数,但是在*NIX下,由于这些函数并非GCC官方定义,基本都无法使用,那么这意味着不能够在Linux/Unix/Mac下面控制光标了吗?并非如此,而且有更好的方法:转义序列。
控制光标定位
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 消隐。