[C] Come stampare dei colori?

di Anonimizzato13171 il
18 risposte
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

  • 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?
  • Scusa il maiuscolo, era per essere chiaro.

    comunque su windows.
  • 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.
  • 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;
    }
    
  • 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).
  • 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!
  • Per compilare i file.c penso che sia la strada giusta come dice proprio msdn
  • 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(...) ?
  • 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.
  • 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
  • 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