सी में stdlib और रंगीन आउटपुट


125

मैं एक साधारण एप्लिकेशन बना रहा हूं जिसमें रंगीन आउटपुट की आवश्यकता होती है। मैं अपने आउटपुट को emacs और bash जैसे रंगीन कैसे बना सकता हूं?

मुझे विंडोज की परवाह नहीं है, क्योंकि मेरा आवेदन केवल UNIX सिस्टम के लिए है।

जवाबों:


288

सभी आधुनिक टर्मिनल एमुलेटर रंग और अन्य चीजों को दिखाने के लिए एएनएसआई एस्केप कोड का उपयोग करते हैं।
पुस्तकालयों के साथ परेशान मत करो, कोड वास्तव में सरल है।

अधिक जानकारी यहाँ है

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
लेकिन मुझे लगता है कि मैं एंशी एस्क्यू सेक्सेस का समर्थन नहीं करने वाले टर्मिनल एमुलेशन में बैश चला सकता हूं।
शिनटकेज़ोउ

अच्छा झंडा :) बस एक नट कि सवाल 'सी' टैग किया गया है, न कि 'सी ++'
स्टीफन

@ShinTakezou: हां .. इस मामले में सभी ANSI एस्केप कोड को नजरअंदाज कर दिया जाएगा, और आपके पास फैंसी आउटपुट बनाने के लिए कोई विकल्प नहीं होगा।
15-12 में रूस के कैनिकोव्स

14
ANSI एस्केप सीक्वेंस की व्याख्या शेल द्वारा नहीं की जाती है, इनकी व्याख्या टर्मिनल एमुलेटर द्वारा की जाती है।
नन्हलज

6
विशेष रूप से प्यार करता था "पुस्तकालयों के साथ परेशान मत करो"! ANSI कोड विंडोज कमांड प्रॉम्प्ट में भी काम करते हैं।
एसवाईजी

15

रंग क्रम से निपटने से गड़बड़ हो सकती है और विभिन्न सिस्टम अलग-अलग रंग अनुक्रम संकेतक का उपयोग कर सकते हैं।

मैं आपको ncurses का उपयोग करने का प्रयास करने का सुझाव दूंगा । रंग के अलावा, ncurses कंसोल यूआई के साथ कई अन्य स्वच्छ चीजें कर सकते हैं।


अलग-अलग रंग अनुक्रमों का उपयोग करने का कारण यह है कि मुझे "color.h" फ़ाइल नहीं मिल सकती है जो मेरे लिए काम करती है?
कूल जेवलिन

10

आप रंगीन टर्मिनल आउटपुट प्राप्त करने के लिए विशेष रंग नियंत्रण कोड का उत्पादन कर सकते हैं, यहां रंगों को प्रिंट करने का एक अच्छा संसाधन है ।

उदाहरण के लिए:

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

संपादित करें: मेरे मूल एक ने शीघ्र रंग कोड का उपयोग किया, जो काम नहीं करता है :( यह एक करता है (मैंने इसे परीक्षण किया)।


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~संकलन त्रुटियों का एक गुच्छा से ज्यादा कुछ नहीं :(

इसके अलावा, मेरा आवेदन BASH पर निर्भर नहीं होना चाहिए।

@Koning: यह BASH निर्भर नहीं है, यह अन्य गोले में भी काम करता है (लेकिन मुझे यकीन है कि सभी नहीं हैं)। मैंने ksh, और csh में सत्यापित किया। नोट मैंने ठीक से काम करने के लिए नियंत्रण कोड संपादित किया है।
स्टीफन

2
यह नहीं होगा। यह टर्मिनल एमुलेशन पर निर्भर करता है। यदि यह एएनएसआई समझ एएनएसआई से बचने के क्रम है, तो आप अपने रंग, बोल्ड, या जो कुछ भी होगा।
शिनटकेज़ोउ

@Stephen बोनस: बदलें 22द्वारा 1में यह देखने के लिए बोल्ड
xxx ---

9

आप इसे अधिक उपयोगी बनाने के लिए हर कार्यक्षमता में एक रंग असाइन कर सकते हैं।

#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");
}

बुद्धिमान की तरह आप अलग-अलग रंग कोड का चयन कर सकते हैं और इसे अधिक सामान्य बना सकते हैं।


3

यदि आप पूरे कार्यक्रम के लिए एक ही रंग का उपयोग करते हैं, तो आप printf()फ़ंक्शन को परिभाषित कर सकते हैं ।

   #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

क्योंकि आप स्ट्रिंग फ़ॉर्मेटिंग वाले चरित्र को प्रिंट नहीं कर सकते हैं। आप कुछ इस तरह से एक प्रारूप जोड़ने के बारे में भी सोच सकते हैं

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

f में प्रारूप है printf

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

छप जाएगा blue bar

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

छप जाएगा 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;
}

रीडिंग विकिपीडिया :

  • \ Xb [0 मी सभी विशेषताओं को रीसेट करता है
  • \ X1b [31 मीटर लाल करने के लिए अग्रभूमि रंग सेट करता है
  • \ X1b [44m पृष्ठभूमि को नीले रंग में सेट करेगा।
  • दोनों: \ X1b [३१; ४४ मी
  • दोनों लेकिन उलटे : \ X1b [31; 44; 7 मी
  • बाद में रीसेट करने के लिए याद रखें \ X1b [0m ...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.