In C un'istruzione printf lunga può essere suddivisa in più righe?


88

Ho la seguente dichiarazione:

Voglio romperlo. Ho provato quanto segue ma non funziona.

Come posso romperlo?


1
Alcuni buoni suggerimenti forniti, ma nessuno dei due può essere chiaro o mantenibile come solo quattro chiamate separate a printf ().
Clifford

@ Clifford: allora potresti scrivere C ++ così cout ti sembra migliore.
Test

Risposte:


175

Se vuoi spezzare una stringa letterale su più righe, puoi concatenare più stringhe insieme, una su ogni riga, in questo modo:


86
solo commentando per spiegare il fatto poco noto in C che lo spazio bianco tra due stringhe è concatenazione.
Brian Postow

2
@Lundin Avere ogni variabile e il suo valore chiaramente rappresentati sulla propria riga è molto più facile da leggere per me. Riuscite a immaginare un debugger in un IDE che metta tutte le variabili e i valori su una singola riga? Non posso. (Sì, lo 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

Questa concatenazione è effettuata dal preprocessore?
debuti il

23

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

Il preprocessore può utilizzare una barra rovesciata come ultimo carattere della riga, senza contare CR (o CR / LF, se sei di Windowsland):


6
Il primo è già stato suggerito, il secondo soffre del fatto che si rompe se c'è uno spazio dopo la "\"; un bug che può essere sconcertante quando si verifica.
Clifford

1
Nessuno di questi due esempi ha niente a che fare con il preprocessore C.
Dan Moulding

@ Dan il mio cpp sembra capire / (vedi la mia modifica sopra). Non sono sicuro che questo sia un comportamento standard.
sigjuice

@Dan Mentre l'unione di letterali adiacenti può essere eseguita con il preprocessore o con il compilatore (nell'ultima fase prima della compilazione effettiva), la continuazione della riga di gestione viene eseguita dal preprocessore, perché altrimenti le macro su più righe non possono essere implementate. Vedi anche qui - gcc.gnu.org/onlinedocs/cpp/Initial-processing.html
qrdl

2
@qrdl: Colpa mia, hai ragione sul secondo. La continuazione della riga viene sempre eseguita dal preprocessore. A volte ho bisogno di essere ricordato che sono senza un know-it-all;) Io continuo a pensare che nel caso normale il compilatore unisce stringhe letterali, però.
Dan Moulding

20

Solo alcune altre opzioni di formattazione:

Puoi aggiungere variazioni al tema. L'idea è che i printf()valori di conversione e le rispettive variabili siano tutti allineati "bene" (per alcuni valori di "piacevolmente").


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

3

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

O se vuoi:

Non dovresti dividere la stringa, né dovresti usare \per spezzare una linea C. Tale codice diventa rapidamente completamente illeggibile / non mantenibile.


3

Non penso che usare printfun'istruzione per stampare stringhe letterali come visto sopra sia una buona pratica di programmazione; piuttosto, si può usare il pezzo di codice qui sotto:

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.