[C] Come stampare dei colori?

di il
18 risposte

[C] Come stampare dei colori?

Allora, comincio col dire che sono in 2° superiore, perciò potete capire che sono alle basi delle basi delle basi [...] delle basi del c.

volevo far si che in un programma di calcolo, il risultato venga scritto colorato, possibilmente in rosso, ad esempio.

è possibile farlo in c?

NON C++, NON C#, C BASE BASE.

grazie in anticipo.

18 Risposte

  • Re: [C] Come stampare dei colori?

    Sappiamo bene che il C non è il C++ o il C#, non serve specificarlo in maiuscolo...
    Comunque su che piattaforma vorresti far girare questo programma di calcolo?
  • Re: [C] Come stampare dei colori?

    Scusa il maiuscolo, era per essere chiaro.

    comunque su windows.
  • Re: [C] Come stampare dei colori?

    http://code-reference.com/c/conio.h/textcolo

    Questo dovrebbe fare ciò che cerchi...
    Purtroppo non ho più windows e non posso provare, ma dovrebbe funzionare.
  • Re: [C] Come stampare dei colori?

    Funzionerebbe se ha il compilatore che supporti la conio,dato che non è una libreria standard!

    Sotto windows puoi fare cosi:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdarg.h>
    #include <windows.h>
    
    void textcolor(unsigned short color)
    {
        HANDLE hconsole  = GetStdHandle(STD_OUTPUT_HANDLE);
        if (hconsole == INVALID_HANDLE_VALUE) return;
        SetConsoleTextAttribute(hconsole,color);
    }
    
    void printfk(char* format,...)
    {
        va_list ap;
        va_start(ap,format);
    
        char data[32];
        char* pdata;
        int vap;
        char* pcap;
        double dap;
        int* piap;
        int process;
        while (*format != '\0')
        {
            if (*format != '%')
            {
                putchar(*format);
                ++format;
            }
            else
            {
                pdata = data;
                process = 0;
                while (*format != '\0')
                {
                    *pdata++ = *format++;
                    switch (*format)
                    {
                        case 'd':
                        case 'i':
                        case 'o':
                        case 'u':
                        case 'x':
                        case 'X':
                        case 'c':
                            vap = va_arg(ap,int);
                            *pdata++ = *format++;
                            *pdata = '\0';
                            printf(data,vap);
                            process = 1;
                        break;
                        case 's':
                            pcap = va_arg(ap,char*);
                            *pdata++ = *format++;
                            *pdata = '\0';
                            printf(data,pcap);
                            process = 1;
                        break;
                        case 'e':
                        case 'f':
                        case 'g':
                            dap = va_arg(ap,double);
                            *pdata++ = *format++;
                            *pdata = '\0';
                            printf(pdata,dap);
                            process = 1;
                        break;
                        case 'p':
                        case 'n':
                            piap = va_arg(ap,int*);
                            *pdata++ = *format++;
                            *pdata = '\0';
                            printf(data,piap);
                            process = 1;
                        break;
                        case '%':
                            *pdata++ = *format++;
                            *pdata = '\0';
                            printf(data);
                            process = 1;
                        break;
                        case 'k':
                            if (pdata - data == 1)
                                vap = va_arg(ap,int);
                            else
                            {
                                *pdata = '\0';
                                data[0] = '0';
                                vap = atoi(data);
                            }
                            ++format;
                            textcolor(vap);
                            process = 1;
                        break;
                    }//switch %
                    if (process) break;
                }//while %
            }//is %
        }//every char format
    
        va_end(ap);
    }
    
    int main()
    {
        textcolor(7);
        puts("Hello World");
        textcolor(12);
        puts("Evviva");
    
        ///my printfc
        ///add conversion k to printf
        ///format:: %nnk change color to nn
        ///format:: %k change color from parameter
        int k = 10;
        printfk("%9kprintfk without parameter color\n");
        printfk("%kprintfk with parameter color:%d\n",k,k);
    
        return 0;
    }
    
    oltre alla definizione della textcolor ti ho aggiunto la funzionalità all'interno della printf.
    Spero di non aver commesso errori perchè ho estratto il codice da una mia libreria.
    Per ulteriori chiarimenti sono qui.
  • Re: [C] Come stampare dei colori?

    Dimenticavo,un ottimo esercizio consiste nel vedere tutti i colori disponibili:
    
    int main()
    {
        printfk("%15kAscii Color Table:\n");
    
        int x,y;
        for (y=0; y < 16 ; y++)
        {
            for (x=0; x < 16 ; x++)
                printfk("%k%3d",y * 16 + x,y * 16 + x);
            printf("\n");
        }
        textcolor(7);
        return 0;
    }
    
  • Re: [C] Come stampare dei colori?

    Textcolor non mi funziona, perciò ho usato system(color).

    ora però ho un'altra domanda, con system("color 0A") TUTTO il testo viene scritto in quel colore (0A, in questo caso è il verde acqua, ma so che si possono inserire numeri da 0 a 8 per indicare lo sfondo, e lettere da A ad F per indicare il colore dei caratteri).

    dato che ciò che sto facendo è un convertitore, vorrei che soltanto il risultato fosse scritto colorato, non tutto il programma, anche se dopo il printf che mi interessa inserisco un system color che riporta i colori allo standard dell'msdos.

    è possibile fare ciò rimanendo nel C di windows, o c'è da oltrepassare il confine ed andare nel c++? non che mi stia antipatico, per carità, è solo che utilizzo visual c++ 2010, e il sorgente di questo programma "convertito" (alla fine è un copia-incolla asd) in c++ non riesco a farlo funzionare, in quanto utilizzo delle potenze pow(base, esponente) con la libreria math.h, ma mi dà degli errori riguardanti appunto questa libreria quando cerco di eseguirlo.

    se qualcuno vuole scuriosarlo per darmi una mano, per non far diventare kilometrica questa discussione, linko direttamente il download del file .c -> https://hostr.co/t14Qm4EKPvM
    ripeto, per farlo in c++ ho semplicemente fatto copia-incolla dentro ad un nuovo file .cpp.

    poi avrei anche un altro problema: come si fa a compilare con visual c++?
    perchè io per creare un file .c, dato che supporta solo il c++, vado in una qualche cartella, creo un file .txt e lo rinomino semplicemente in .c, poi ci lavoro, e per compilarlo vado nelle opzioni di visual c++ -> prompt -> cd blablabla (per spostarmi nella cartella nella quale c'è il file .c) -> cl /EHsc nomefile.c (per farglielo compilare).

    mi chiedevo, c'è sempre da fare tutto questo casino, o basta premere qualche pulsante (il debug, per qualche stranissimo motivo, non me lo fa cliccare).
  • Re: [C] Come stampare dei colori?

    textcolor non mi funziona, perciò ho usato system(color).

    ora però ho un'altra domanda, con system("color 0A") TUTTO il testo viene scritto in quel colore (0A, in questo caso è il verde acqua, ma so che si possono inserire numeri da 0 a 8 per indicare lo sfondo, e lettere da A ad F per indicare il colore dei caratteri).

    dato che ciò che sto facendo è un convertitore, vorrei che soltanto il risultato fosse scritto colorato, non tutto il programma, anche se dopo il printf che mi interessa inserisco un system color che riporta i colori allo standard dell'msdos.

    è possibile fare ciò rimanendo nel C di windows, o c'è da oltrepassare il confine ed andare nel c++? non che mi stia antipatico, per carità, è solo che utilizzo visual c++ 2010, e il sorgente di questo programma "convertito" (alla fine è un copia-incolla asd) in c++ non riesco a farlo funzionare, in quanto utilizzo delle potenze pow(base, esponente) con la libreria math.h, ma mi dà degli errori riguardanti appunto questa libreria quando cerco di eseguirlo.
    Non ti funziona è una affermazione troppo vaga.
    Che errori ti da?
    Hai linkato la libreria "Kernel32"

    Per fare il resto usi poi la funzione postata printfk che semplifica tutto,dove il numero prima della k è il colore:
    
    printfk("%12kTest %15k%d %7k,1999);
    
    Con questo esempio scrivi test in rosso poi 1999 in bianco e con %7k torni al colore di default.

    Usare la system per questi scopi è una pessima idea!
  • Re: [C] Come stampare dei colori?

    Per compilare i file.c penso che sia la strada giusta come dice proprio msdn
  • Re: [C] Come stampare dei colori?

    Grazie delle risposte.
    ho provato il printfk, però non mi funziona, allego l'errore: https://hostr.co/hg7mZeMQQl8

    e allego anche il codice, non si sa mai.
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdarg.h>
    #include <windows.h>
    
    int main()
    {
    	printfk("%12kTest %15k%d %7k,1999");
    	system("pause");
    	return 0;
    }
    poi mi chiedevo un'altra cosa.
    si può inserire il separatore delle migliaia nel c?
    per esempio, far si che il numero "1578924,842" venga visualizzato "1.578.924,842"? (o anche "1,578,924.842", l'importante è che si separino le migliaia, poi se vengono separate con una virgola o con un punto è la stessa cosa).

    inoltre, è possibile bloccare in caso qualcuno inserisca un decimale con più di 3 cifre dopo la virgola? sì, so che basta mettere %.3f, ma se io volessi creare un if cosicchè gli dia proprio un messaggio "hai inserito troppi decimali. puoi inserirne al massimo 3.", cosa dovrei mettere nell'if(...) ?
  • Re: [C] Come stampare dei colori?

  • Re: [C] Come stampare dei colori?

    oregon ha scritto:


    Ma scusa, l'hai usato ma non l'hai aggiunto nel tuo codice.
    Dov'è la funzione printfk che ti è stata suggerita? ?

    nel messaggio precedente, no? :O

    ho provato a creare un file .c per testare il printfk, ma non andava, ed ho linkato l'errore.
  • Re: [C] Come stampare dei colori?

  • Re: [C] Come stampare dei colori?

    oregon ha scritto:


    No ... tu hai mostrato la "chiamata" alla funzione, ma nel tuo codice non c'è la funzione che ti era stata fornita.

    Conosci la differenza tra chiamata a funzione e corpo della funzione? no, stai andando troppo avanti
  • Re: [C] Come stampare dei colori?

    Guarda nelle risposte di vbextreme ... c'è il codice della funzione che comincia così
    
    void printfk(char* format,...)
    {
        va_list ap;
        va_start(ap,format);
    
    Quel codice deve stare nel tuo programma altrimenti non potrai chiamare la funzione printfk dato che non esiste!

    Se hai questo tipo di dubbi elementari probabilmente devi studiare un po' di più le basi del linguaggio prima di avventurarti a scrivere codice. Non ti sarebbe utile scrivere senza comprendere bene.
Devi accedere o registrarti per scrivere nel forum
18 risposte