如何在 C++ 中改變控制檯的顏色

Jinku Hu 2023年12月11日
  1. 使用 ANSI 轉義碼改變控制檯顏色
  2. 使用 SetConsoleTextAttribute() 方法在 C++ 中更改控制檯文字的顏色
如何在 C++ 中改變控制檯的顏色

本文將介紹幾種在 C++ 中更改控制檯文字顏色的方法。

使用 ANSI 轉義碼改變控制檯顏色

由於顏色不是標準 C++ 庫的一部分,而且特定於控制檯的功能大多由作業系統處理,所以沒有本地語言功能來為輸出流新增顏色。雖然,我們討論了一些平臺特有的處理文字輸出著色的方法。

ANSI 轉義碼是解決這個問題的一種相對可移植的方法。轉義碼是一個位元組序列,主要以 ASCII 轉義字元和括號字元開頭,後面是引數。這些字元嵌入到輸出文字中,控制檯將這些序列解釋為命令而不是要顯示的文字。ANSI 程式碼包括多種顏色格式,完整的細節可以在本頁上看到。在下面的程式碼示例中,我們演示了將幾個顏色字元定義為巨集,並在隨後將這些符號包含在 printf 字串引數中。請注意,printf 將多個雙引號的字串連線在第一個引數的地方傳遞。

#include <iostream>

#define NC "\e[0m"
#define RED "\e[0;31m"
#define GRN "\e[0;32m"
#define CYN "\e[0;36m"
#define REDB "\e[41m"

using std::cout;
using std::endl;

int main(int argc, char *argv[]) {
  if (argc < 2) {
    printf(RED "ERROR" NC
               ": provide argument as follows -> ./program argument\n");
    exit(EXIT_FAILURE);
  }
  printf(GRN "SUCCESS!\n");

  return EXIT_SUCCESS;
}

輸出(無程式引數):

ERROR: provide argument as follows -> ./program argument

輸出(帶有程式引數):

SUCCESS!

另外,同樣的轉義碼也可以用於 cout 呼叫。注意,不需要多次使用 << 流插入操作符,只需將巨集符號與字串字面結合,因為它們會自動組合在一起。

#include <iostream>

#define NC "\e[0m"
#define RED "\e[0;31m"
#define GRN "\e[0;32m"
#define CYN "\e[0;36m"
#define REDB "\e[41m"

using std::cout;
using std::endl;

int main() {
  cout << CYN "Some cyan colored text" << endl;
  cout << REDB "Add red background" NC << endl;
  cout << "reset to default colors with NC" << endl;

  return EXIT_SUCCESS;
}

輸出:

Some cyan colored text
Add red background
reset to default with NC

使用 SetConsoleTextAttribute() 方法在 C++ 中更改控制檯文字的顏色

SetConsoleTextAttribute 是 Windows API 方法,用於使用不同的引數設定輸出文字的顏色,該函式設定了由 WriteFileWriteConsole 函式寫入控制檯螢幕緩衝區的字元的屬性。該函式設定 WriteFileWriteConsole 函式寫入控制檯螢幕緩衝區的字元的屬性。字元屬性的完整描述可以在這個頁面上看到。

#include << windows.h>>

#include <iostream>
#include <string>

using std::cout;
using std::endl;

int main() {
  std::string str("HeLLO tHERe\n");
  DWORD bytesWritten = 0;

  HANDLE cout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(console_handle,
                          FOREGROUND_RED | BACKGROUND_INTENSITY);
  WriteFile(cout_handle, str.c_str(), str.size(), &bytesWritten, NULL);

  return EXIT_SUCCESS;
}

輸出:

Some red colored text
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ IO