Come formattare le stringhe usando printf () per ottenere la stessa lunghezza nell'output?


92

Ho due funzioni, una che produce messaggi simili Starting initialization...e un'altra che controlla i codici di ritorno e gli output "Ok", "Warning"o "Error". Tuttavia, l'output che viene prodotto è di diversa lunghezza:

Starting initialization...Ok.
Checking init scripts...Ok.

Come posso ottenere qualcosa di simile:

Starting initialization...       Ok.
Checking init scripts...         Ok.

Risposte:


159

È possibile specificare la larghezza nei campi stringa, ad es

printf("%-20s", "initialization...");

e quindi tutto ciò che viene stampato con quel campo verrà riempito in bianco per la larghezza indicata.

La -sinistra giustifica il testo in quel campo.


130
Ahimè, non sono abbastanza intelligente da contare così in alto. Tuttavia, confido che il richiedente sia abbastanza intelligente da estrapolare dal mio esempio :)
Carl Smotricz

3
che dire giustificato a destra? Non ci sono flag menzionati in K&R
Ungeheuer

9
Giustificato a destra è l'impostazione predefinita. Senza un -, i tuoi dati saranno giustificati a destra in un campo di cui hai specificato la larghezza.
Carl Smotricz

24

printfconsente la formattazione con specificatori di larghezza. per esempio


printf( "%-30s %s\n", "Starting initialization...", "Ok." );

Utilizzeresti uno specificatore di larghezza negativo per indicare la giustificazione a sinistra perché l'impostazione predefinita è utilizzare la giustificazione a destra.


18

Inoltre, se desideri la flessibilità di scegliere width, puoi scegliere tra uno dei seguenti due 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."

13

C'è anche il %nmodificatore che può aiutare in determinate circostanze. Restituisce la colonna su cui si trovava la stringa fino a quel momento. Esempio: vuoi scrivere diverse righe che sono 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 le due stringhe header1e header2possono avere. Non so se tutte le implementazioni hanno il %nma Solaris e Linux lo fanno.


Questa soluzione funziona, ma chiunque la prenda e la inserisca nel proprio codice dovrebbe essere consapevole del rischio di introdurre vulnerabilità della memoria .
Matthew Cole

0

C'è anche la soluzione piuttosto low-tech di contare l'aggiunta di spazi a mano per allineare i tuoi messaggi. Niente ti impedisce di includere alcuni spazi finali nelle stringhe del messaggio.


-2

Inizia con l'uso delle tabulazioni, il modificatore di caratteri \ t . Avanzerà in 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 il problema, scrivi il tuo "OK / NOK" utilizzando un numero fisso di tabulazioni (5? 6 ?, provalo), quindi restituisci ( \ r ) senza nuovo rivestimento e scrivi il tuo messaggio.


5
C'è sempre il pericolo che una stringa sia più lunga di un punto di tabulazione, costringendo così la tabulazione e il testo risultanti a non essere allineati.
PP.

Non proprio ... prima scrivi il tabbed OK / NOK, poi / r, ora scrivi la frase, ora / n. La frase potrebbe sovrascrivere l'OK / NOK. Ma il tuo modo è molto migliore, non sapevo giustificazione negativa.
jpinto3912
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.