2010-03-12 7 views
23

La prima cosa che mi viene in mente è di fare un mucchio di \ t, ma questo potrebbe causare disallineamento delle parole se qualche parola è più lunga di qualsiasi altra parola da pochi caratteri.Come organizzo correttamente l'output in colonne?

Per esempio, mi piacerebbe avere qualcosa di simile:

Name Last Name   Middle initial 
Bob  Jones    M 
Joe  ReallyLongLastName T 

Invece, includendo solo "\ t" s 'nella mia dichiarazione cout riesco solo per ottenere

Name Last Name   Middle initial 
Bob  Jones    M 
Joe  ReallyLongLastName    T 

o

Name Last Name   Middle initial 
Bob  Jones M 
Joe  ReallyLongLastName T 

Cos'altro avrei bisogno di fare?

MODIFICA: Quindi ho capito che dovrei prima contare la larghezza massima di ogni colonna che voglio visualizzare, e quindi aggiungere gli spazi di riempimento di conseguenza. Ma come, e con quali funzioni, posso fare questo? Dovrei semplicemente contare il numero di caratteri in una stringa e poi andare da lì?

risposta

28

Uso std::setw da <iomanip>

esempio

using std::cout; 
using std::setw; 

cout << setw(10) << "This" << 
     setw(10) << "is" << 
     setw(10) << "a" << 
     setw(10) << "test" << '\n'; 

uscita:

 This  is   a  test 
+7

Penso che dovresti usare anche 'cout << left' –

+0

Grazie a te e ad Alexandre! Finalmente ho avuto quello che volevo :) – wrongusername

7

È inoltre necessario tenere conto del fatto che diversi editor/visitatori visualizzano testo con larghezza diversa. Quindi, usando le schede, il testo che sembra ben disposto in un solo visualizzatore può sembrare brutto in un altro.

Se si desidera produrre una buona disposizione, è possibile utilizzare gli spazi di riempimento e si potrebbero eseguire due passaggi sul testo: innanzitutto contare la larghezza massima di ciascuna colonna, quindi aggiungere la giusta quantità di spazi di riempimento a ciascuna colonna. Per quest'ultimo, è anche possibile utilizzare una chiamata su misura printf.

Aggiornamento: Il conteggio della larghezza della colonna significa fondamentalmente il conteggio della lunghezza delle stringhe che si hanno in una determinata colonna. Può essere eseguito utilizzando string::length() o strlen(), a seconda che si utilizzi std::string o char* (il primo è consigliato). Quindi basta scorrere tutte le parole in quella colonna, confrontare la lunghezza massima della parola che hai finora, e se la parola corrente è più lunga, devi impostare quella lunghezza come nuova massima. Se si memorizzano le parole in un contenitore STL, è anche possibile utilizzare lo std::max_element algorithm per eseguire il lavoro con una singola chiamata di funzione.

+0

Grazie! Come posso contare la larghezza massima di ogni colonna? – wrongusername

+0

@wrongusername pls vedere il mio aggiornamento. –

+0

Grazie mille! È un'implementazione ancora più flessibile: P – wrongusername

6

Usa printf() imbottitura con la bandiera meno per sinistra-allineamento

printf("%-8s%-21s%-7s%-6s\n", "Name", "Last Name", "Middle", "initial"); 
printf("%-8s%-21s%-7s%-6s\n", "Bob", "Jones", "M", ""); 
printf("%-8s%-21s%-7s%-6s\n", "Joe", "ReallyLongLastName", "T", ""); 

che produce:

Name Last Name   Middle initial 
Bob  Jones    M 
Joe  ReallyLongLastName T 
+2

Abbastanza soddisfacente, ma dati i tag, forse sarebbe stata preferibile una soluzione iostream. – Clifford

2

Per situazioni come questa di solito sono necessari due passaggi: uno per scoprire la larghezza massima di ogni colonna e un altro per fare la stampa. Per gli iostream standard, è possibile utilizzare la routine width() in modo che lo iostream gestisca automaticamente il padding.