Dalam C dapat pernyataan printf panjang dipecah menjadi beberapa baris?

88

Saya memiliki pernyataan berikut:

Saya ingin memutuskannya. Saya mencoba yang berikut ini tetapi tidak berhasil.

Bagaimana saya bisa memecahnya?

neuromancer
sumber
1
Beberapa saran bagus diberikan, tetapi tidak satu pun dari mereka mungkin sejelas atau dapat dipertahankan seperti hanya empat panggilan printf () terpisah.
Clifford
@ Clifford: maka Anda bisa menulis C ++ sehingga cout terlihat lebih baik untuk Anda.
Uji

Jawaban:

175

Jika Anda ingin memecah string literal menjadi beberapa baris, Anda dapat menggabungkan beberapa string menjadi satu, satu di setiap baris, seperti ini:

James McNellis
sumber
86
hanya berkomentar untuk menjelaskan fakta C yang kurang diketahui bahwa spasi antara dua string adalah penggabungan.
Brian Postow
2
@Lundin Memiliki setiap variabel dan nilainya yang terwakili dengan jelas pada barisnya sendiri jauh lebih mudah untuk saya baca. Dapatkah Anda membayangkan debugger dalam IDE yang meletakkan semua variabel dan nilai ke dalam satu baris? Aku tidak bisa. (Ya, saya tahu itu tidak menempatkan karakter baris baru di antara setiap string, tetapi saya membandingkan ketersediaan kode sumber dengan kesiapan variabel dalam debugger)
byxor
Apakah penggabungan ini dibuat oleh preprocessor?
debuti
23

Kompiler C dapat merekatkan string literal yang berdekatan menjadi satu, seperti

Praprosesor dapat menggunakan garis miring terbalik sebagai karakter terakhir baris, tidak termasuk CR (atau CR / LF, jika Anda berasal dari Windowsland):

qrdl
sumber
6
Yang pertama telah disarankan, yang kedua menderita karena rusak jika ada spasi setelah '\'; bug yang bisa membingungkan saat terjadi.
Clifford
1
Tak satu pun dari kedua contoh tersebut yang ada hubungannya dengan C preprocessor.
Dan Moulding
@Dan cpp saya sepertinya mengerti / (lihat edit saya di atas). Saya tidak yakin apakah ini perilaku standar.
sigjuice
@Dan Saat menggabungkan literal yang berdekatan dapat dilakukan dengan preprocessor atau compiler (pada tahap terakhir sebelum kompilasi sebenarnya), penanganan kelanjutan baris dilakukan oleh preprocessor, karena jika tidak, makro multiline tidak dapat diterapkan. Lihat juga di sini - gcc.gnu.org/onlinedocs/cpp/Initial-processing.html
qrdl
2
@qrdl: Saya buruk, Anda benar tentang yang kedua. Kelanjutan jalur selalu dilakukan oleh preprocessor. Kadang-kadang saya perlu diingatkan bahwa saya bukan orang yang tahu segalanya;) Saya masih berpikir bahwa dalam kasus normal kompilator bergabung dengan literal string.
Dan Moulding
20

Hanya beberapa opsi pemformatan lainnya:

Anda dapat menambahkan variasi pada tema. Idenya adalah bahwa printf()speficiers konversi dan variabel terkait semuanya berbaris "baik" (untuk beberapa nilai "baik").

pmg
sumber
Tidak ada yang berfungsi di sini, tetapi ide baru yang belum pernah saya lihat sebelumnya. Saya menyukainya, komentar bagus @pmg!
rpj
3

Cara standar de-facto untuk membagi fungsi kompleks di C adalah per argumen:

Atau jika Anda mau:

Anda tidak boleh memisahkan string, juga tidak boleh digunakan \untuk memutuskan garis C. Kode tersebut dengan cepat berubah menjadi tidak terbaca / tidak dapat dipertahankan.

Lundin
sumber
3

Saya tidak berpikir menggunakan satu printfpernyataan untuk mencetak string literal seperti yang terlihat di atas adalah praktik pemrograman yang baik; melainkan, seseorang dapat menggunakan potongan kode di bawah ini:

antoine maboula
sumber