code review!
代码
#include <iostream>
// 定义ANSI转义序列来设置文本样式和背景
constexpr const char* HIGHLIGHT_STYLE = "\033[4;34;43m"; // 蓝色下划线文本和黄色背景
constexpr const char* RESET_STYLE = "\033[0m"; // 重置文本样式到默认
int main() {
// 使用定义好的ANSI转义序列来高亮打印测试信息
std::cout << HIGHLIGHT_STYLE << "----------高亮打印测试------" << RESET_STYLE << std::endl;
return 0;
}
代码
#include <iostream>
int main() {
// 使用定义好的ANSI转义序列来高亮打印测试信息
std::cout << "\e[4;34;43m"
<< "----------高亮打印测试------"
<< "\e[0m" << std::endl;
return 0;
}
在这两段代码中:
<< "\e[0m" << std::endl;
和
<< "\033[0m" << std::endl;
唯一的区别是用于表示ANSI转义序列中的ESC(Escape)字符的表示方法不同。
"\e"
是一种在一些编译器和环境中支持的转义序列,用于表示ESC字符,其ASCII码值为27。"\033"
使用八进制表示法表示同一个ESC字符(因为33是27的八进制表示)。在功能上,两者完全相同,都用于重置终端的文本格式到默认设置。这意味着在打印了带有特定颜色和格式的文本之后,这些序列将终端格式重置,以防随后的输出也被同样的格式影响。
然而,不是所有的编译器都识别"\e"
这种表示方式。例如,GCC和Clang通常支持它,但是根据C和C++的标准,这不是一个标准的转义序列。相比之下,"\033"
是一个更加可移植和标准的方式来编写ESC,因为它是基于ASCII码值的八进制转义序列,所有符合标准的C和C++编译器都会支持它。
在编写依赖于特定终端特性的代码(如ANSI转义序列)时,通常推荐使用更加可移植的表示方法。因此,如果你不确定编译器是否支持"\e"
,使用"\033"
是一个更安全的选择。
文章主要内容抄自:《鲨鱼编程》公众号文章:C++控制台彩色时钟的实现.
代码
#include <iostream>
#include <iomanip>
#include <chrono>
#include <thread>
// 定义ANSI转义序列来控制文本颜色
const char* HOUR_COLOR = "\033[31m"; // 红色小时
const char* MINUTE_COLOR = "\033[32m"; // 绿色分钟
const char* SECOND_COLOR = "\033[33m"; // 黄色秒
const char* RESET_COLOR = "\033[0m"; // 重置颜色
void print_colored_time() {
// 获取当前时间
auto now = std::chrono::system_clock::now();
auto now_time_t = std::chrono::system_clock::to_time_t(now);
std::tm* now_tm = std::localtime(&now_time_t);
// 输出彩色时钟
std::cout << HOUR_COLOR << std::setw(2) << std::setfill('0') << now_tm->tm_hour << ":"
<< MINUTE_COLOR << std::setw(2) << std::setfill('0') << now_tm->tm_min << ":"
<< SECOND_COLOR << std::setw(2) << std::setfill('0') << now_tm->tm_sec
<< RESET_COLOR << std::endl;
}
int main() {
while (true) {
print_colored_time();
std::this_thread::sleep_for(std::chrono::seconds(1)); // 等待1秒
// 清空控制台,以便下次输出
// 注意:这种清空控制台的方法在Windows和Linux/macOS上可能不同
// 下面的代码适用于Windows系统
// system("CLS");
// 对于Linux/macOS系统,可以使用
// system("clear");
}
return 0;
}