2013-07-19 6 views
11

chciałbym wydrukować kolumn za pomocą printf w C Napisałem ten kod:Print równa szerokości kolumn w C z użyciem formatowania 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; 
} 

To działa, ale mam taki wynik:

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

Więc kolumny nie mają równej szerokości. Zasadniczo chciałbym sprawić, aby tak było, że bez względu na to, jak długi jest tekst w mojej argumentacji, moja funkcja ZAWSZE drukuje ładne sformatowane kolumny. Pytanie brzmi: jak mogę to zrobić?

od słów piękny miałem na myśli, że nie ważne jak długo tekst przechodzę do mojej funkcji drukowania, to zawsze wydrukować równej szerokości kolumn, na przykład:

mam to wyjście, które wygląda tak:

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 

chcę wyglądać tak (bez względu na to, jak długo moje argumenty tekstowe będzie):

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

Określ * ładny * w * ładnie sformatowanych kolumnach *. – ouah

+2

, więc najpierw przeskanuj swój tekst, znajdź najdłuższy ciąg znaków i użyj tej długości dla wartości wypełnienia kolumn. –

+0

Prawdopodobnie duplikat http://stackoverflow.com/questions/2956296/printing-values-in-special-format-using-printf –

Odpowiedz

4

You Można znaleźć maksymalną długość txt1, txt2 i txt3, a następnie sformatować go:

// 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

Co się stanie, jeśli masz ciągłe wydruki (np.nieprzerwanie drukuje informacje do struktury przypominającej tabelę) i nagle dane dla jednej kolumny są dłuższe niż wszystkie poprzednie (kolumna musi być szersza)? Wiem o '\ b' i' \ r', ale tak naprawdę nie rozwiązują tego problemu. – Arc676

+0

Może to mój kompilator, ale dlaczego ta metoda nie działa dla mnie? 'printf ("%. * s ", 5," hi ");' po prostu drukuje "hi" tak jakby długość nie była określona, ​​ale '% 5s' działa poprawnie. Czy masz jakieś linki, które szczegółowo wyjaśniają to wszystko? Zakładam, że wyszukiwanym hasłem będzie "formatowanie w printf"? – Arc676

3

Niestety, nie jest banalna sposób to robi.

Można zrobić metodę dwa przejścia - w 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]); 

a następnie to:

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, ponieważ użycie '% * s' zamiast'%. * S' (zanotuj okres) jak w zaakceptowanej odpowiedzi ta metoda _nie_ drukuje wiodących zer podczas drukowania liczb całkowitych ('% * d'). – Arc676

8

Jeśli chcesz struny być obcięta, jeśli są większe niż szerokość kolumny, a następnie możesz dodać dokładność dla specyfikacji formatu ciągu znaków:

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

Z tym printf(), wyjście swoim przykładzie programu wygląda następująco:

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

Spójrz na mój prosty biblioteki, libtprint: https://github.com/wizzard/libtprint Kod jest dość prosta, powinieneś być w stanie zrozumieć, jak to działa.

Zasadniczo potrzebujesz grać z szerokością pól dla każdej kolumny i obliczać przesunięcia wyrównania.

Mam nadzieję, że pomoże!