Linux C/C++ 如何输出彩色字体

版权声明:本文为作者原创,未经允许,请勿转载。 https://blog.csdn.net/qq_42876636/article/details/82960511

先举个例子:

#include <iostream>

int main()
{
	std::cout<<"\033[33mHello \033[34mworld!\033[0m"<<std::endl;
	return 0;
}

执行以上代码,你将会看到红色的Hello和蓝色的world!
观察上述代码,你会发现我用了三个\033[*m
这就是Linux输出彩色字体的关键
下表就是每个类似的字符串所代表的意思 (此表转自此处)
\033[0m 关闭所有属性
\033[1m 高亮
\033[2m 亮度减半
\033[3m 斜体
\033[4m 下划线
\033[5m 闪烁
\033[6m 快闪
\033[7m 反显
\033[8m 消隐
\033[9m 中间一道横线
10-19 关于字体的
21-29 基本与1-9正好相反
30-37 设置前景色
40-47 设置背景色
30:黑
31:红
32:绿
33:黄
34:蓝
35:紫
36:深
37:白
38 打开下划线,设置默认前景色
39 关闭下划线,设置默认前景色
40 黑色背景
41 红色背景
42 绿色背景
43 棕色背景
44 蓝色背景
45 品红背景
46 孔雀蓝背景
47 白色背景
48 不知道什么东西
49 设置默认背景色
50-89 没用
90-109 又是设置前景背景的,比之前的颜色浅
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标

根据上表,就可以写一个函数,做到切换各种颜色
代码如下 (只支持一些常用的颜色)

//color.h
#ifndef SETCOLOR_H
#define SETCOLOR_H

const int F_BLACK = 0x01	// 000001
const int F_RED = 0x02		// 000010
const int F_GREEN = 0x03	// 000011
const int F_YELLOW = 0x04	// 000100
const int F_BLUE = 0x05		// 000101
const int F_DPURPLE = 0x06	// 000110
const int F_WHITE = 0x07	// 000111

const int B_BLACK = 0x08	// 001000
const int B_RED = 0x10		// 010000
const int B_GREEN = 0x18	// 011000
const int B_BROWN = 0x80	// 100000
const int B_BLUE = 0x88		// 101000
const int B_WHITE = 0x90	// 110000
//缺一个111000,但就这些了

bool setColor(int color); // color是一个前景色于一个后景色的位或结果
void resetFColor(); // 重置前景色
void resetBColor(); // 重置背景色

#endif // SETCOLOR_H
//color.cpp
#include "color.h"
#include <iostream>

bool setColor(int color)
{
	bool ret = true;
	int fore = color%8;	//取color的后3位
	int back = (color/8)*8;	//将color的后3位清空 (即取前3位)
	switch (fore)
	{
	case F_BLACK:std::cout<<"\033[30m";break;
	case F_RED:std::cout<<"\033[31m";break;
	case F_GREEN:std::cout<<"\033[32m";break;
	case F_YELLOW:std::cout<<"\033[33m";break;
	case F_BLUE:std::cout<<"\033[34m";break;
	case F_PURPLE:std::cout<<"\033[35m";break;
	case F_WHITE:std::cout<<"\033[37m";break;
	default:ret = false;
	}
	switch (back)
	{
	case B_BLACK:std::cout<<"\033[40m";break;
	case B_RED:std::cout<<"\033[41m";break;
	case B_GREEN:std::cout<<"\033[42m";break;
	case B_BROWN:std::cout<<"\033[43m";break;
	case B_BLUE:std::cout<<"\033[44m";break;
	case B_WHITE:std::cout<<"\033[47m";break;
	default:ret = false;
	}
	return ret;
}
void resetFColor()
{std::cout<<"\033[39m";}
void resetBColor()
{std::cout<<"\033[49m";}

注:本段代码未经测试,可能会有错误,请谅解!

最后,我们来编译一下这个文件不会手动编译的朋友们注意了

  1. 使用指令$ sudo apt-get install gcc g++来安装C和C++ (没有用Ubuntu的朋友们百度找找C和C++的编译器吧)
  2. 进入那两个文件存放的目录
  3. 使用指令$ g++ -c -o test.o test.cpp来生成目标文件 (假设那两个文件名为test.h和test.cpp)
  4. 使用指令$ gcc -fPIC -shared test.o来生成动态链接库
  5. 使用指令$ ar rcs -o libtest.a test.so来生成静态库 (ar在安装gccg++时已经安装好)
  6. 如果你编辑好了main函数放在main.cpp里,则可以进行后两步
  7. 使用指令g++ -c -o main.o main.cpp生成目标文件
  8. 如果你使用动态链接库,使用指令gcc -o main -L. -ltest main.cpp生成main (libtest.so必须放在main的所在目录下,否则main.exe失效)
  9. 如果你使用静态库,使用指令gcc -o main main.o libtest.a生成main (libtest.a不一定一直放在main的所在目录下,因为main不依赖)

猜你喜欢

转载自blog.csdn.net/qq_42876636/article/details/82960511