Newsgroup: it.comp.lang.c
Titolo: Stringhe in formato tabulare

Ciao a tutti.
Ho il seguente codice:
printf("%s %s %s\n",st1,st2,st3);
eseguendo varie volte printf devo incolonnare l'output in modo che mi venga
fuori una specie di tabella:
fffff ggggg hhhhhh
rrrrr ttttt wwwwww
----- ----- ------
Purtroppo se la lunghezza di "st1", "st2" e "st3" non e' uguale l'output non
viene incolonnato.
Come posso fare? C'e' una qualche funzione pronta o devo fare a mano
calcolando la lunghezza delle singole stringhe e aggiungendo spazi per
incolonnare?
Grazie e ciao.
--
Slaine Mc Roth dal portatile
Linux User: 312607

 incolonnare?
Prova con
printf("%s\t%s\t%s\n",st1,st2,st3);
-- 
Tnk
Luca "Kleidemos" Francesca
Un computer a un altro quando si incontrano:
"Ciao, come ti boota oggi???"

 incolonnare?
Ovviamente non puo' esistere una funzione gia' pronta:
quando stampa la prima riga, non puo' sapere cosa tu vorrai
stampare nella seconda, quindi non potrebbe stabilire la giusta
spaziatura.
Ti hanno gia' suggerito di usare la tabulazione (\t) che
naturalmente ha i suoi limiti, perche' a seconda della lunghezza
delle stringhe potresti andare a finire nel tab sbagliato.
Alternativamente, se sai a priori che ad esempio le colonne per
st1, st2 e st3 hanno una certa lunghezza massima, puoi specificarla
nella printf e allineare le stringhe a destra o a sinistra:
per allinearle a destra:
printf("%10s %8s %12s\n",st1,st2,st3);
oppure per allinenarle a sinistra:
printf("%-10s %-8s %-12s\n",st1,st2,st3);
se invece non sai a priori la lunghezza max dei vari campi,
ma la puoi calcolare a run-time,
allora, supponendo che queste lughezze massime siano memorizzate
rispettivamente nelle variabili intere mx1,mx2,mx3, allora puoi usare
queste due sintassi:
per allinearle a destra:
printf("%*s %*s %*s\n",mx1,st1,mx2,st2,mx3,st3);
per allinearle a sinistra:
printf("%-*s %-*s %-*s\n",mx1,st1,mx2,st2,mx3,st3);
ciao,
g.

 printf("%s\t%s\t%s\n",st1,st2,st3);
Grazie mille. In effetti era semplice, bastava leggere attentamente i vari
escape da passare a printf. Uff.. oggi non gira :((
Ciao e grazie ancora.


 printf("%-*s %-*s %-*s\n",mx1,st1,mx2,st2,mx3,st3);
WOW! Grazie per le info che mi saranno utilissime.
Ciao.


 printf("%s\t%s\t%s\n",st1,st2,st3);
beh, questo funziona solo se len(s) <= della lunghezza del \t .
ti faccio un esempio:
char *s1 = "1234567890abcdefg";
char *s2 = "123";
char *s3 = "123456";
printf("%s\t%s\t%s\n",s1,s2,s3);
printf("%s\t%s\t%s\n",s2,s1,s3);
printf("%s\t%s\t%s\n",s3,s2,s1);
a me produce:
1234567890abcdefg       123     123456
123     1234567890abcdefg       123456
123456  123     1234567890abcdefg
che non e' molto ben incolonnato!
avendo invece:
printf("%20s%20s%20s\n",s1,s2,s3);
printf("%20s%20s%20s\n",s2,s1,s3);
printf("%20s%20s%20s\n",s3,s2,s1);
e consentendo alle stringhe di occupare al massimo 20 caratteri otteniamo:
   1234567890abcdefg                 123              123456
                 123   1234567890abcdefg              123456
              123456                 123   1234567890abcdefg
che e' sicuramente incolonnato giusto (nota che devi vederlo con caratteri
fixed size!).
Tommy


mi associo: io non avevo mai fatto la richiesta sul ng,
ma in effetti anche a me serviva sapere questa cosa!!!
very grazie anche da parte mia.
bye ;-)