Nano Hash - криптовалюты, майнинг, программирование

Как я могу печатать на консоли в цвете кросс-платформенным способом?

Как я могу вывести цветной текст с помощью «printf» как в Mac OS X, так и в Linux?

01.03.2010

Ответы:


1

Вы можете использовать цветовые коды ANSI. Вот пример программы:

#include <stdio.h>
    
int main(int argc, char *argv[])
{
  printf("%c[1;31mHello, world!\n", 27); // red
  printf("%c[1;32mHello, world!\n", 27); // green
  printf("%c[1;33mHello, world!\n", 27); // yellow
  printf("%c[1;34mHello, world!\n", 27); // blue
  return 0;
}

27 — это символ escape. Вы можете использовать \e, если хотите.

В сети есть списки всех кодов. Вот один.

01.03.2010
  • Предполагая escape-последовательности ANSI, популяризированные производными VT100 (VT1xx не имел цвета). И вы могли бы использовать "\033" вместо "%c", 27. 01.03.2010
  • @ephemient, даже \e работал на моей машине. Терминал OS X и большинство консольных приложений Linux поддерживают escape-последовательности ANSI, поэтому я думаю, что это удовлетворяет его вопрос. 01.03.2010
  • Если я правильно помню, \e предназначен только для gcc. 11.10.2012
  • Есть ли шанс, что вы можете объяснить более подробно, что здесь происходит для новичка? Кажется, в документации по printf об этом ничего нет. Что заставляет этот синтаксис работать таким образом? Просто интересно лучше понять! Спасибо :) 15.06.2014
  • @Hendeca, это потому, что это не имеет ничего общего с printf. Дело в том, что сама терминальная программа интерпретирует эти escape-коды как команды для изменения цвета, который она использует на экране. 15.06.2014

  • 2

    Другой вариант:

    # Define some colors first (you can put this in your .bashrc file):
    red='\e[0;31m'
    RED='\e[1;31m'
    blue='\e[0;34m'
    BLUE='\e[1;34m'
    cyan='\e[0;36m'
    CYAN='\e[1;36m'
    green='\e[0;32m'
    GREEN='\e[1;32m'
    yellow='\e[0;33m'
    YELLOW='\e[1;33m'
    NC='\e[0m'
    #################
    

    Затем вы можете ввести в терминале:

    echo -e "${RED}This is an error${NC}"
    echo -e "${YELLOW}This is a warning${NC}"
    echo -e "${GREEN}Everythings fine!${NC}"
    

    Не забудьте ${NC} в конце. NC означает «без цвета», что означает, что после вашего предложения он вернется к нормальному цвету. Если вы его забудете, вся подсказка и последующие команды будут окрашены в указанный вами цвет (конечно, вы можете ввести 'echo -e "${NS}"', чтобы вернуть его обратно).

    11.03.2010
  • Похоже, это не работает в терминале на Mac (OS X v10.9.1) — я не помещал его в .bashrc, просто определил его в оболочке в командной строке — но текст был напечатан напрямую. 24.02.2014
  • Вопрос был о команде «printf», а не о командах терминала. Более того, было запрошено кросс-платформенное решение, «поместите это в свой .bashrc» не так. 15.08.2014
  • @TimZaman Ну, технически ОП запросил решение как для Mac OS X, так и для Linux, так что поместить его в .bashrc — это именно то, что нужно. Хотя я согласен, что он не отвечает, как это сделать с помощью printf. Я чувствую необходимость указать, что я дал свой ответ в качестве альтернативы: Другой вариант: вместо того, чтобы заявить, что это действительно был ответ. 10.12.2014

  • 3

    Для лучшей переносимости запросите базу данных terminfo. В ракушке,

    colors=(black red green yellow blue magenta cyan white)
    for ((i = 0; i < ${#colors[*]}; i++)); do
        ((j=(i+1)%${#colors[*]}))
        printf '%s%s%s on %s%s\n' "$(tput setaf $i)" "$(tput setab $j)" \
                "${colors[i]}" "${colors[j]}" "$(tput op)"
    done
    

    распечатает

    black on red
    red on green
    green on yellow
    yellow on blue
    blue on magenta
    magenta on cyan
    cyan on white
    white on black
    

    но в цвете.

    01.03.2010
  • +1 хорошо, но как мне это сделать из C? Кажется, я не могу найти библиотечные эквиваленты для tput - может быть, выдернуть его прямо из открытого исходного кода? 02.02.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..