2013-07-19 16 views
11

Vorrei stampare colonne utilizzando printf in C. Ho scritto questo codice:stampa colonne della stessa larghezza in C utilizzando la formattazione printf

#include <stdio.h> 

void printme(char *txt1, char *txt2, char *txt3) 
{ 
    printf("TXT1: %9s TXT2 %9s TXT3 %9s\n", txt1, txt2, txt3); 
} 


int main() 
{ 
    printme("a","bbbbbbbeeeeebbbbb","e"); 
    printme("aaaaaaaa","bbbbbbbbbbbb","abcde"); 
    return 0; 
} 

Funziona ma non ho tale uscita:

TXT1:   a TXT2 bbbbbbbeeeeebbbbb TXT3   e 
TXT1: aaaaaaaa TXT2 bbbbbbbbbbbb TXT3  abcde 

Quindi le colonne non hanno la stessa larghezza. Fondamentalmente, mi piacerebbe farlo in questo modo, che non importa quanto sia lungo il testo nel mio argomento, la mia funzione SEMPRE SEMPRE stamperà una bella colonna formattata. La domanda è: come posso fare questo?

Con saing bello Volevo dire che non importa quanto tempo il testo passo alla mia funzione di stampa, sarà sempre stampare le colonne della stessa larghezza, ad esempio:

Ho questa uscita che assomiglia a questo:

a   cd`   fg   ij 
a   cd    fg   ij 
a   cd    fg   ij 
ab   cd    fg   ij 
ab   cd    fg   i j 
ab   cd    fg   ij 
ab   cd    fg   ij 
ab   cde    fgh   ij 
ab   cde    fgh   ij 

voglio farlo sembrare come questo (non importa quanto tempo i miei argomenti di testo saranno):

a   cd`   fg   ij 
a   cd   fg   ij 
a   cd   fg   ij 
ab  cd   fg   ij 
ab  cd   fg   ij 
ab  cd   fg   ij 
ab  cd   fg   ij 
ab  cde   fgh   ij 
ab  cde   fgh   ij  
+2

Definire * nice * in * belle colonne formattate *. – ouah

+2

quindi analizza in anticipo il tuo testo, scopri quale sia la stringa più lunga e usa quella lunghezza per i valori di riempimento della colonna. –

+0

Forse un duplicato di http://stackoverflow.com/questions/2956296/printing-values-in-special-format-using-printf –

risposta

4

è riesce a trovare la lunghezza massima per txt1, txt2 e txt3, e quindi formattarlo:

// compute the max string length of txt1 inputs in advance 
int s1 = strlen(firstTxt1); 
if (s1 < strlen(secondTxt1) 
    s1 = strlen(secondTxt1); 
... 

printf("%.*s %.*s %.*s\n", s1, txt1, s2, txt2, s3, txt3); 
+0

Cosa succede se si dispone di output continuo (ad es.stampare continuamente informazioni in una struttura simile a una tabella) e improvvisamente i dati di una colonna sono più lunghi di tutti i suoi predecessori (la colonna deve essere ingrandita)? Conosco '\ b' e' \ r', ma in realtà non risolvono questo problema. – Arc676

+0

Forse è il mio compilatore, ma perché questo metodo non funziona per me? 'printf ("%. * s ", 5," hi ");' stampa solo "hi" come se la lunghezza non fosse specificata ma '% 5s' funzioni correttamente. Avete dei link che spiegano specificamente questo in dettaglio? Suppongo che il termine di ricerca di Google sia "formattazione in printf"? – Arc676

3

Purtroppo, non esiste un metodo banale per fare questo.

Si potrebbe fare un metodo a due passaggi - in main():

char **data[] = { { "a","bbbbbbbeeeeebbbbb","e" }, 
        {"aaaaaaaa","bbbbbbbbbbbb","abcde" } }; 


get_columwidths(data[0][0], data[0][1], data[0][2]); 
get_columwidths(data[1][0], data[1][1], data[1][2]); 

printme(data[0][0], data[0][1], data[0][2]); 
printme(data[1][0], data[1][1], data[1][2]); 

e poi questo:

int columnwidths[3]; 

void get_columwidths(const char *s1, const char *s2, const char *s3) 
{ 
    int len1 = strlen(s1); 
    int len2 = strlen(s2); 
    int len3 = strlen(s3); 

    if (columnwidths[0] < len1) columnwidths[0] = len1; 
    if (columnwidths[1] < len2) columnwidths[1] = len2; 
    if (columnwidths[2] < len3) columnwidths[2] = len3; 
} 

void printme(char *txt1, char *txt2, char *txt3) 
{ 
    printf("TXT1: %*s TXT2 %*s TXT3 %*s\n", 
      columnwidths[0], txt1, columnwidths[1], txt2, columnwidths[2], txt3); 
} 
+0

+1 perché usando '% * s' invece di'%. * S' (nota il punto) come nella risposta accettata questo metodo non _non_ stampa gli zeri iniziali quando si stampano numeri interi ('% * d'). – Arc676

8

Se si desidera che le stringhe da troncate se sono più grandi di la larghezza della colonna, quindi è sufficiente aggiungere una precisione per la specifica del formato stringa:

printf("TXT1: %9.9s TXT2 %9.9s TXT3 %9.9s\n", txt1, txt2, txt3); 

Con quello printf(), l'uscita del vostro programma di esempio si presenta come:

TXT1:   a TXT2 bbbbbbbee TXT3   e 
TXT1: aaaaaaaa TXT2 bbbbbbbbb TXT3  abcde 
2

Date un'occhiata al mio semplice libreria, libtprint: https://github.com/wizzard/libtprint Il codice è abbastanza semplice, si dovrebbe essere in grado di capire come funziona.

Fondamentalmente ciò che serve è giocare con le larghezze dei campi per ogni colonna e calcolare gli offset di allineamento.

Spero che aiuti!

Problemi correlati