【问题标题】:Using different colors in the same stringstream with ncurses (C++)使用 ncurses (C++) 在同一个字符串流中使用不同的颜色
【发布时间】:2019-08-15 17:28:40
【问题描述】:

我正在编写代码,我正在使用 ncursesstringstreams (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;
}

我怎样才能做到这一点?

有可能吗?

【问题讨论】:

  • 那么,如果我理解得很好,那么您将使用 ncurses 原语一次性将 stingstream_var 打印到终端?你想让大字符串的一些子字符串有不同的颜色吗?

标签: c++ colors ncurses stringstream


【解决方案1】:

根据官方文档:

颜色对 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-22
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多