Saya mendengar bahwa Anda harus menghindari memimpin baris baru saat menggunakan printf
. Sehingga printf("\nHello World!")
sebaiknya Anda gunakanprintf("Hello World!\n")
Dalam contoh khusus di atas tidak masuk akal, karena output akan berbeda, tetapi pertimbangkan ini:
printf("Initializing");
init();
printf("\nProcessing");
process_data();
printf("\nExiting");
dibandingkan dengan:
printf("Initializing\n");
init();
printf("Processing\n");
process_data();
printf("Exiting");
Saya tidak dapat melihat manfaat dengan mengikuti baris baru, kecuali terlihat lebih baik. Apakah ada alasan lain?
SUNTING:
Saya akan membahas suara penutupan di sini dan sekarang. Saya tidak berpikir ini milik Stack overflow, karena pertanyaan ini terutama tentang desain. Saya juga akan mengatakan bahwa meskipun mungkin ada pendapat tentang masalah ini, jawaban Kilian Foth dan jawaban cmaster membuktikan bahwa memang ada manfaat yang sangat objektif dengan satu pendekatan.
init()
danprocess_data()
mencetak sesuatu sendiri? Seperti apa hasil yang Anda harapkan jika itu terjadi?\n
adalah terminator garis , bukan pemisah garis . Ini dibuktikan oleh fakta bahwa file teks, di UNIX, hampir selalu berakhir\n
.Jawaban:
Sejumlah I / O terminal cukup buffer-line , jadi dengan mengakhiri pesan dengan \ n Anda dapat yakin bahwa itu akan ditampilkan secara tepat waktu. Dengan petunjuk \ n pesan dapat ditampilkan atau tidak sekaligus. Seringkali, ini berarti bahwa setiap langkah menampilkan pesan progres dari langkah sebelumnya , yang menyebabkan kebingungan tanpa akhir dan membuang waktu ketika Anda mencoba memahami perilaku suatu program.
sumber
fprintf(STDERR, …)
, yang umumnya tidak buffer sama sekali untuk output diagnostik.Pada sistem POSIX (pada dasarnya setiap linux, BSD, sistem berbasis open source apa pun yang dapat Anda temukan), sebuah baris didefinisikan sebagai serangkaian karakter yang diakhiri oleh baris baru
\n
. Ini adalah asumsi dasar semua alat baris perintah standar membangun, termasuk (namun tidak terbatas pada)wc
,grep
,sed
,awk
, danvim
. Ini juga alasan mengapa beberapa editor (sepertivim
) selalu menambahkan a\n
di akhir file, dan mengapa standar C sebelumnya mengharuskan header untuk diakhiri dengan\n
karakter.Btw: Setelah
\n
mengakhiri baris membuat pemrosesan teks lebih mudah: Anda tahu pasti bahwa Anda memiliki baris yang lengkap ketika Anda memiliki terminator itu. Dan Anda tahu pasti bahwa Anda perlu melihat lebih banyak karakter jika Anda belum menemukan terminator itu.Tentu saja, ini ada di sisi input program, tetapi output program sangat sering digunakan sebagai input program lagi. Jadi, output Anda harus tetap pada konvensi demi memungkinkan masukan tanpa batas ke program lain.
sumber
Selain apa yang disebutkan orang lain, saya merasa ada alasan yang lebih sederhana: itu standar. Setiap kali sesuatu dicetak ke STDOUT, hampir selalu mengasumsikan bahwa itu sudah ada di baris baru, dan dengan demikian tidak perlu memulai yang baru. Itu juga mengasumsikan baris berikutnya yang akan ditulis akan bertindak dengan cara yang sama, sehingga membantu mengakhiri dengan memulai baris baru.
Jika Anda menampilkan garis baris baru di awal yang disatukan dengan garis trailing-baris baru standar, "itu akan berakhir seperti ini:
... yang mungkin bukan yang Anda inginkan.
Jika Anda hanya menggunakan baris baru yang memimpin dalam kode Anda dan hanya menjalankannya dalam IDE, itu mungkin akan baik-baik saja. Segera setelah Anda menjalankannya di terminal atau memperkenalkan kode orang lain yang akan menulis ke STDOUT di samping kode Anda, Anda akan melihat output yang tidak diinginkan seperti di atas.
sumber
$PS1
, yang kemudian akan mengganggu program konvensional.Karena jawaban yang sangat tinggi telah memberikan alasan teknis yang sangat baik mengapa mengikuti baris baru harus lebih disukai, saya akan mendekatinya dari sudut lain.
Menurut pendapat saya, berikut ini membuat program lebih mudah dibaca:
Dari poin di atas, kita dapat berargumen bahwa mengikuti baris baru lebih baik. Baris baru memformat "noise" bila dibandingkan dengan pesan, pesan harus menonjol dan karenanya harus didahulukan (penyorotan sintaks juga dapat membantu).
sumber
"ok\n"
jauh lebih baik daripada"\nok"
..."\pFoobar"
.Menggunakan trailing newlines menyederhanakan modifikasi selanjutnya.
Sebagai contoh (sangat sepele) berdasarkan kode OP, misalkan Anda perlu menghasilkan beberapa output sebelum pesan "Inisialisasi", dan output tersebut berasal dari bagian logis yang berbeda dari kode, dalam file sumber yang berbeda.
Ketika Anda menjalankan tes pertama dan menemukan "Inisialisasi" sekarang ditambahkan ke akhir baris dari beberapa output lain, Anda harus mencari melalui kode untuk menemukan di mana ia dicetak, dan kemudian berharap mengubah "Inisialisasi" menjadi "\ nInisialisasi "Tidak mengacaukan format sesuatu yang lain, dalam keadaan yang berbeda.
Sekarang pertimbangkan bagaimana menangani fakta bahwa output baru Anda sebenarnya opsional, jadi perubahan Anda ke "\ nInitializing" terkadang menghasilkan baris kosong yang tidak diinginkan pada awal output ...
Apakah Anda menetapkan bendera global ( guncangan horor ?? !!! ) yang mengatakan apakah ada keluaran sebelumnya dan mengujinya untuk mencetak "Inisialisasi" dengan memimpin opsional "\ n", atau apakah Anda menampilkan "\ n" bersama dengan output Anda sebelumnya dan meninggalkan pembaca kode masa depan bertanya-tanya mengapa "Inisialisasi" ini tidak memiliki "" memimpin "seperti semua pesan output lainnya lakukan?
Jika Anda secara konsisten menampilkan trailing baris baru, pada titik di mana Anda tahu Anda telah mencapai ujung garis yang perlu dihentikan, Anda menghindari semua masalah itu. Catatan, yang mungkin memerlukan pernyataan put ("\ n") yang terpisah di akhir beberapa logika yang menghasilkan sepotong demi sepotong, tetapi intinya adalah Anda menampilkan baris baru di tempat paling awal dalam kode di mana Anda tahu harus lakukan itu, bukan di tempat lain.
sumber
Sangat cocok dengan spesifikasi C.
Pustaka C mendefinisikan garis sebagai diakhiri dengan karakter baris baru
'\n'
.Kode yang menulis data sebagai baris kemudian akan cocok dengan konsep perpustakaan itu.
Re: baris terakhir membutuhkan pemutusan karakter baris baru . Saya akan merekomendasikan untuk selalu menulis final
'\n'
pada output dan mentolerir ketidakhadiran pada input.Pemeriksaan ejaan
Pemeriksa ejaan saya mengeluh. Mungkin Anda juga.
sumber
ispell.el
untuk mengatasi dengan lebih baik. Saya akui itu lebih sering\t
menjadi masalah, dan itu bisa dihindari hanya dengan memecah string menjadi beberapa token, tapi itu hanya efek samping dari pekerjaan "abaikan" yang lebih umum, untuk secara selektif melewati bagian non-teks dari HTML atau badan multi bagian MIME, dan bagian kode yang tidak dikomentari. Saya selalu bermaksud memperluasnya ke peralihan bahasa di mana ada metadata yang sesuai (misalnya<p lang="de_AT">
atauContent-Language: gd
), tetapi tidak pernah mendapatkan Round Tuit. Dan pengelola langsung menolak patch saya. :-(ispell.el
.Memimpin baris baru sering kali dapat membuatnya lebih mudah untuk menulis kode ketika ada persyaratan, misalnya,
(Tetapi seperti yang telah dicatat di tempat lain Anda mungkin perlu menyiram buffer output sebelum melakukan langkah-langkah yang membutuhkan banyak waktu CPU.)
Oleh karena itu kasus yang baik dapat dibuat untuk kedua cara melakukannya, namun secara pribadi saya tidak suka printf () dan akan menggunakan kelas khusus untuk membangun output.
sumber
"\nProcessing"
.printf
. Bagaimana jika Anda ingin mengkondisikan seluruh baris "Inisialisasi"? Anda harus memasukkan baris "Memproses" dalam kondisi itu untuk mengetahui apakah Anda harus mengawali dengan baris baru atau tidak. Jika ada cetakan lain di depan dan Anda perlu mengkondisikan baris "Memproses", Anda juga perlu menyertakan cetakan berikutnya dalam kondisi itu untuk mengetahui apakah Anda harus mengawali dengan baris baru lainnya, dan sebagainya untuk setiap cetakan.if ((addr & 0x0F)==0) printf("\n%08X:", addr);
dan tanpa syarat menambahkan baris baru ke output di akhir, daripada menggunakan kode terpisah untuk setiap tajuk baris dan baris tambahan.Baris baru terkemuka tidak berfungsi dengan baik dengan fungsi perpustakaan lain, terutama
puts()
danperror
di Perpustakaan Standar, tetapi juga perpustakaan lain yang mungkin Anda gunakan.Jika Anda ingin mencetak baris pra-tertulis (baik konstanta, atau yang sudah diformat - misalnya dengan
sprintf()
), makaputs()
adalah pilihan alami (dan efisien). Namun, tidak ada cara untukputs()
mengakhiri baris sebelumnya dan menulis baris yang tidak ditentukan - selalu menulis terminator garis.sumber