Come formattare le stringhe usando printf () per ottenere la stessa lunghezza nell'output?
-
05-07-2019 - |
Domanda
Ho due funzioni, una che produce messaggi come Avvio inizializzazione ...
e un'altra che controlla i codici di ritorno e genera " Ok "
, " Avviso "
o " Errore "
. Tuttavia, l'output che viene prodotto è di diversa lunghezza:
Starting initialization...Ok.
Checking init scripts...Ok.
Come posso ottenere qualcosa del genere:
Starting initialization... Ok.
Checking init scripts... Ok.
Soluzione
Puoi specificare la larghezza sui campi stringa, ad es.
printf("%-20s", "initialization...");
e quindi qualsiasi cosa sia stampata con quel campo verrà riempita in bianco alla larghezza che indichi.
Il -
giustifica a sinistra il testo in quel campo.
Altri suggerimenti
printf
consente la formattazione con identificatori di larghezza. per es.
printf( "%-30s %s\n", "Starting initialization...", "Ok." );
Dovresti utilizzare un identificatore di larghezza negativa per indicare la giustificazione a sinistra perché l'impostazione predefinita è utilizzare la giustificazione a destra.
Inoltre, se desideri la flessibilità di scegliere la larghezza
, puoi scegliere tra uno dei due seguenti formati (con o senza troncamento):
int width = 30;
//no truncation uses %-*s
printf( "%-*s %s\n", width, "Starting initialization...", "Ok." );
// output is "Starting initialization... Ok."
//truncated to the specified width uses %-.*s
printf( "%-.*s %s\n", width, "Starting initialization...", "Ok." );
// output is "Starting initialization... Ok."
C'è anche il modificatore % n
che può aiutare in determinate circostanze. Restituisce la colonna su cui la stringa era finora. Esempio: si desidera scrivere più righe all'interno della larghezza della prima riga come una tabella.
int width1, width2;
int values[6][2];
printf("|%s%n|%s%n|\n", header1, &width1, header2, &width2);
for(i=0; i<6; i++)
printf("|%*d|%*d|\n", width1, values[i][0], width2, values[i][1]);
stamperà 2 colonne della stessa larghezza di qualunque lunghezza possano avere le due stringhe header1
e header2
.
Non so se tutte le implementazioni hanno il % n
, ma Solaris e Linux sì.
C'è anche la soluzione piuttosto a bassa tecnologia di contare l'aggiunta di spazi a mano per allineare i tuoi messaggi. Nulla ti impedisce di includere alcuni spazi finali nelle stringhe di messaggi.
Inizia con l'uso delle schede, il modificatore di carattere \ t . Passerà a una posizione fissa (colonne, gergo terminale). Tuttavia, non aiuta se ci sono differenze superiori alla larghezza della colonna (4 caratteri, se ricordo bene).
Per risolvere questo problema, scrivi il tuo " OK / NOK " roba utilizzando il numero fisso di schede (5? 6?, provalo), quindi torna ( \ r ) senza nuovo allineamento e scrivi il tuo messaggio.