使用ncurses在同一字符串流中使用不同的颜色(C ++)

时间:2019-03-25 12:59:18

标签: c++ colors ncurses stringstream

我正在编写代码,并且正在使用 ncurses stringstreams (C ++)。

我想打印()红色(如果为负数)和绿色(如果为正数)。

通过程序的结构,我将单个字符串流用于整个输出。因此,如果我使用以下方式更改颜色:

start_color();
init_pair(1, COLOR_RED, COLOR_BLACK);
init_pair(2, COLOR_GREEN, COLOR_BLACK);
attron(COLOR_PAIR(1));

它为所有输出着色(我只希望数字被着色)。 我也尝试过使用ANSI代码,但不适用于ncurses。

我的代码是这样的:

stringstream_var.clear();
stringstream_var.str(std::string());

if (num1 < 0){
  //I just want to print num1 in red
  stringstream_var << "Number 1: " << num1 << std::endl;
}else{
  //I just want to print num1 in green
  stringstream_var << "Number 1: " << num1 << std::endl;
}

我该如何实现?

有可能吗?

1 个答案:

答案 0 :(得分:2)

根据官方文档:

  

颜色对0是特殊的;表示“无颜色”。

因此,您可以创建一个辅助函数,该函数使用std::string来打印有关COLOR_PAIR值的给定颜色的文本。像这样:

#include <curses.h>

void print_with_color(const std::string& text, int color_pair) {
    attron(COLOR_PAIR(color_pair));
    printw(text.c_str());
}

void print_without_color(const std::string& text) {
    attron(COLOR_PAIR(0)); // No color
    printw(text.c_str());
}

int main(void) {
    initscr();
    start_color();

    init_pair(1, COLOR_BLACK, COLOR_RED);
    init_pair(2, COLOR_BLACK, COLOR_GREEN);

    print_without_color("Number 1: ");
    int number = std::rand();
    if (number) {
       print_with_color(std::to_string(number), 1);
    } else {
       print_with_color(std::to_string(number), 2);
    }
    refresh();
}

在任何情况下,如果您要使用C ++流,最好寻找一个现代的替代方案。选中termcolor。您可以执行以下操作:

if (number) {
   std::cout << "Number 1: " << termcolor::red << number << std::endl;
} else {
   std::cout << "Number 1: " << termcolor::green << number << std::endl;
}