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

StackOverflow https://stackoverflow.com/questions/1809399

  •  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.
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top