2016-02-11 23 views
5

Sto provando a scrivere un programma che visualizza il valore numerico di alcune costanti di caratteri (quelle nelle istruzioni if). Il codice funziona, tranne per un problema. L'output dovrebbe essere ben allineato in colonne, ma come mostrato di seguito, non lo è. Qual è il modo migliore per allineare correttamente le colonne?Allineamento colonne in uscita C

Ecco il mio codice:

#include <stdio.h> 
#include <ctype.h> 

int main() { 

    unsigned char c; 

    printf("%3s %9s %12s %12s\n", "Char", "Constant", "Description", "Value"); 

    for(c=0; c<= 127; ++c){ 

     if (c == '\n') { 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\\n","newline","0x", c); 

     }else if (c == '\t'){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\\t","horizontal tab","0x", c); 

     }else if (c == '\v'){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\\v","vertical tab","0x", c); 

     }else if (c == '\b'){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\\b","backspace","0x", c); 

     }else if (c == '\r'){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\\r","carriage return","0x", c); 

     }else if (c == '\f'){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\\f","form feed","0x", c); 

     }else if (c == '\\'){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\\","backslash","0x", c); 

     }else if (c == '\''){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\'","single quote","0x", c); 

     }else if (c == '\"'){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\"","double quote","0x", c); 

     }else if (c == '\0'){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\\0","null","0x", c); 
     } 
    } 


    return 0; 
} 

ecco l'output:

Output

+5

Una buona soluzione qui è l'opzione di giustificazione/lunghezza stringa nelle stringhe di formato. Sei sulla strada giusta con le schede, ma perché hai lunghezze diverse nella colonna della descrizione ti sta buttando fuori. Potresti provare 'printf ("% - 30s ", description) come punto di partenza. –

+0

Se il codice funziona, è più adatto su http://codereview.stackexchange.com/ –

+1

Non funziona in quanto le colonne devono essere allineate ma sono frastagliate –

risposta

4

Utilizzando \t ti lascia in balia del dispositivo di uscita. Invece, potresti usare larghezze di campo minime per le stringhe, ad es. %-20s stamperà almeno 20 caratteri, a destra con spazi vuoti.

%-20.20s troncherà la stringa se fosse più lunga; %-20s salterà su tutto il resto a destra. Il - significa sinistra-giustificazione (di default è il tasto destro del giustifica)


Per evitare la duplicazione di codice è possibile utilizzare una funzione di supporto, ad esempio:

void print_item(char code, char const *abbrev, char const *description) 
{ 
    printf("%3d %7s %20.20s %#03x\n", code, abbrev, description, (unsigned char)code); 
} 

// ... in your function 
if (c == '\n') 
    print_item(c, "\\n", "newline"); 

ho modificato la stringa di formato printf:

  • Utilizzando %20.20s come suggerito sopra
  • %#03x, il # significa s antefatto
  • per l'ultimo significa che si comporterà bene se si è passato alcun carattere negativo in. (In genere i caratteri hanno un valore compreso tra -128 e 127).
+0

Puoi spiegare la parte '% # 03x' più chiaramente, grazie. –

+1

@EricWang è come '% 03x' ma inserisce' 0x' all'inizio –

+0

Vedo, risposta molto bella. –