stdlib và đầu ra màu trong C


125

Tôi đang làm một ứng dụng đơn giản đòi hỏi đầu ra màu. Làm thế nào tôi có thể làm cho đầu ra của tôi có màu như emacs và bash làm gì?

Tôi không quan tâm đến Windows, vì ứng dụng của tôi chỉ dành cho các hệ thống UNIX.

Câu trả lời:


288

Tất cả các trình giả lập thiết bị đầu cuối hiện đại sử dụng mã thoát ANSI để hiển thị màu sắc và những thứ khác.
Đừng bận tâm với các thư viện, mã thực sự đơn giản.

Thêm thông tin ở đây .

Ví dụ trong C:

#include <stdio.h>

#define ANSI_COLOR_RED     "\x1b[31m"
#define ANSI_COLOR_GREEN   "\x1b[32m"
#define ANSI_COLOR_YELLOW  "\x1b[33m"
#define ANSI_COLOR_BLUE    "\x1b[34m"
#define ANSI_COLOR_MAGENTA "\x1b[35m"
#define ANSI_COLOR_CYAN    "\x1b[36m"
#define ANSI_COLOR_RESET   "\x1b[0m"

int main (int argc, char const *argv[]) {

  printf(ANSI_COLOR_RED     "This text is RED!"     ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_GREEN   "This text is GREEN!"   ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_YELLOW  "This text is YELLOW!"  ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_BLUE    "This text is BLUE!"    ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_MAGENTA "This text is MAGENTA!" ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_CYAN    "This text is CYAN!"    ANSI_COLOR_RESET "\n");

  return 0;
}

1
Nhưng tôi cho rằng tôi có thể chạy bash trong một mô phỏng đầu cuối không hỗ trợ seqs thoát ANSI.
ShinTakezou

Cờ đẹp :) Chỉ cần một câu hỏi là câu hỏi được gắn thẻ 'c', không phải 'c ++'
Stephen

@ShinTakezou: Có .. Trong trường hợp này, tất cả các mã thoát ANSI sẽ bị bỏ qua và bạn sẽ không có tùy chọn nào để tạo đầu ra ưa thích.
Andrejs Cainikovs

14
Trình tự thoát ANSI không được giải thích bằng shell, chúng được giải thích bởi các trình giả lập đầu cuối.
ninjalj

6
Đặc biệt yêu thích "đừng bận tâm với thư viện"! Mã ANSI thậm chí hoạt động trong dấu nhắc lệnh của Windows.
SzG

15

Xử lý các chuỗi màu có thể trở nên lộn xộn và các hệ thống khác nhau có thể sử dụng các Chỉ báo trình tự màu khác nhau.

Tôi sẽ đề nghị bạn thử sử dụng ncurses . Khác với màu sắc, ncurses có thể làm nhiều thứ gọn gàng khác với giao diện điều khiển.


Việc sử dụng các chuỗi màu khác nhau có phải là lý do tôi không thể tìm thấy tệp "colors.h" với tất cả công việc được thực hiện cho tôi không?
Cool Javelin

10

Bạn có thể xuất mã kiểm soát màu đặc biệt để có đầu ra màu, đây là một tài nguyên tốt về cách in màu .

Ví dụ:

printf("\033[22;34mHello, world!\033[0m");  // shows a blue hello world

EDIT: Bản gốc của tôi đã sử dụng mã màu nhanh chóng, không hoạt động :( Cái này không (tôi đã kiểm tra nó).


edition.c: In function ‘int main(int, const char**)’: edition.c:4: error: unknown escape sequence '\]' edition.c:4: error: unknown escape sequence '\]' edition.c edition.c~Không có gì hơn một loạt các lỗi biên dịch :(

Ngoài ra, ứng dụng của tôi không nên phụ thuộc vào BASH.

@Kaming: Đây không phải là phụ thuộc BASH, nó cũng hoạt động trong các shell khác (nhưng tôi chắc chắn không phải tất cả). Tôi đã xác minh trong ksh và csh. Lưu ý tôi đã chỉnh sửa mã điều khiển để hoạt động đúng.
Stephen

2
Nó sẽ không được. Nó phụ thuộc vào mô phỏng thiết bị đầu cuối. Nếu đó là ANSI hiểu các chuỗi thoát ANSI, thì bạn sẽ có màu sắc, đậm hoặc bất cứ thứ gì.
ShinTakezou

@Stephen Bonus: Thay đổi 22bằng cách 1để nhìn thấy nó trong đậm .
xxx ---

9

Bạn có thể chỉ định một màu cho mọi chức năng để làm cho nó hữu ích hơn.

#define Color_Red "\33[0:31m\\]" // Color Start
#define Color_end "\33[0m\\]" // To flush out prev settings
#define LOG_RED(X) printf("%s %s %s",Color_Red,X,Color_end)

foo()
{
LOG_RED("This is in Red Color");
}

Giống như khôn ngoan, bạn có thể chọn các mã màu khác nhau và làm cho nó chung chung hơn.


3

Nếu bạn sử dụng cùng màu cho toàn bộ chương trình, bạn có thể xác định printf()chức năng.

   #include<stdio.h>
   #define ah_red "\e[31m"
   #define printf(X) printf(ah_red "%s",X);
   #int main()
   {
        printf("Bangladesh");
        printf("\n");
        return 0;
   }

2

Bởi vì bạn không thể in một ký tự với chuỗi định dạng. Bạn cũng có thể nghĩ đến việc thêm một định dạng với cái gì đó như thế này

#define PRINTC(c,f,s) printf ("\033[%dm" f "\033[0m", 30 + c, s)

f là định dạng như trong printf

PRINTC (4, "%s\n", "bar")

sẽ in blue bar

PRINTC (1, "%d", 'a')

sẽ in red 97


2
#include <stdio.h>

#define BLUE(string) "\x1b[34m" string "\x1b[0m"
#define RED(string) "\x1b[31m" string "\x1b[0m"

int main(void)
{
    printf("this is " RED("red") "!\n");

    // a somewhat more complex ...
    printf("this is " BLUE("%s") "!\n","blue");

    return 0;
}

đọc Wikipedia :

  • \ x1b [0m đặt lại tất cả các thuộc tính
  • \ x1b [31m đặt màu nền trước thành màu đỏ
  • \ x1b [44m sẽ đặt nền thành màu xanh.
  • cả hai: \ x1b [31; 44m
  • cả hai nhưng đảo ngược: \ x1b [31; 44; 7m
  • nhớ đặt lại sau đó \ x1b [0m ...
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.