2009-11-17 12 views
64

Ho la seguente dichiarazione:In C, una lunga frase printf può essere suddivisa in più righe?

printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", sp->name, sp->args, sp->value, sp->arraysize); 

voglio disgregare. Ho provato quanto segue ma non funziona.

printf("name: %s\t 
args: %s\t 
value %d\t 
arraysize %d\n", 
sp->name, 
sp->args, 
sp->value, 
sp->arraysize); 

Come posso suddividerlo?

+0

Alcuni buoni suggerimenti forniti, ma nessuno di essi può essere chiaro o gestibile come solo quattro chiamate printf() distinte. – Clifford

+0

@Clifford: allora potresti scrivere C++ in modo che cout ti stia meglio. – Test

risposta

134

Se si vuole spezzare una stringa letterale su più righe, è possibile concatenare più stringhe insieme, una su ogni riga, in questo modo:

printf("name: %s\t" 
"args: %s\t" 
"value %d\t" 
"arraysize %d\n", 
sp->name, 
sp->args, 
sp->value, 
sp->arraysize); 
+71

commentando semplicemente per spiegare il fatto poco noto che lo spazio bianco tra due stringhe è la concatenazione. –

+0

In che modo esattamente questo ha reso il codice più leggibile? – Lundin

+1

@Lundin Avere ogni variabile e il suo valore chiaramente rappresentati su una propria riga è molto più facile da leggere per me. Riuscite ad immaginare un debugger in un IDE che metta tutte le variabili e i valori su una singola riga? Non posso _ (Sì, so che non inserisce caratteri di nuova riga tra ogni stringa, ma sto confrontando la leggibilità del codice sorgente con la leggibilità delle variabili in un debugger) _ – byxor

18

Solo alcune altre opzioni di formattazione:

printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", 
     a,  b,  c,  d); 

printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", 
       a,  b,  c,   d); 

printf("name: %s\t"  "args: %s\t"  "value %d\t"  "arraysize %d\n", 
     very_long_name_a, very_long_name_b, very_long_name_c, very_long_name_d); 

È possibile aggiungere variazioni sul tema. L'idea è che gli spefiori di conversione printf() e le rispettive variabili siano tutti allineati "bene" (per alcuni valori di "piacevolmente").

+0

Niente di funzionale, ma un'idea nuova che non ho mai visto prima. Mi piace, ottimo commento @ pmg! – rpj

16

Il compilatore C può incollare stringhe adiacenti in uno, come

printf("foo: %s " 
     "bar: %d", foo, bar); 

Il preprocessore può usare una barra rovesciata come ultimo carattere della linea, senza contare CR (o CR/LF, se da Windowsland):

printf("foo %s \ 
bar: %d", foo, bar); 
+6

Il primo è già stato suggerito, il secondo soffre del fatto che si interrompe se vi sono spazi bianchi * dopo * il '\'; un bug che può essere sconcertante quando si verifica. – Clifford

+1

Nessuno di questi due esempi ha nulla a che fare con il preprocessore C. –

+0

@Di mio cpp sembra capire/(vedi la mia modifica sopra). Non sono sicuro se questo è un comportamento standard. – sigjuice

2

non penso utilizzando uno printf dichiarazione di stampare stringhe letterali come visto sopra è una buona pratica di programmazione; piuttosto, si può usare il pezzo di codice qui sotto:

2

Il modo standard de-facto per suddividere funzioni complesse in C è per argomento:

printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", 
     sp->name, 
     sp->args, 
     sp->value, 
     sp->arraysize); 

Oppure, se si vuole:

const char format_str[] = "name: %s\targs: %s\tvalue %d\tarraysize %d\n"; 
... 
printf(format_str, 
     sp->name, 
     sp->args, 
     sp->value, 
     sp->arraysize); 

Non è necessario dividere la stringa, né utilizzare \ per interrompere una riga C. Tale codice diventa rapidamente illeggibile/non gestibile.

Problemi correlati