Mengapa orang menaruh '\ n' di awal string?

8

Sangat sering saya masuk ke kode C di mana printfformat string dimulai dengan \n:

printf ("\ nHello");

Ini menurut saya adalah hal yang menjengkelkan yang tidak menawarkan keuntungan (lebih banyak kerugian!) Sehubungan dengan pencetakan "Hello\n":

  • Jika baris yang dicetak pertama dimulai dengan '\n', output program akan dimulai dengan baris kosong (tidak berguna)
  • Jika baris yang dicetak terakhir tidak berakhir dengan '\n', output program tidak akan berakhir dengan baris baru (berguna saat membaca output pada terminal)
  • Pada sebagian besar terminal (on line buffered stream secara umum), output akan memerah ketika '\n'ditemui, sehingga garis yang tidak berakhir dengan '\n'dapat ditampilkan di layar jauh setelah itu benar printf- benar sudah d (atau mungkin tidak pernah, jika aliran tidak pernah memerah , misalnya jika program macet)

Jadi, mengapa orang suka ini?

peoro
sumber
2
Ini adalah hal kecil yang sangat mengganggu saya. Orang yang melakukan cout << endl << ..; juga membuatku gila. Saya tahu tidak ada perbedaan tapi ...
Vitor Py
Apakah yang Anda maksud "flushing" dalam arti "baris baru" atau seperti di fflush ()?
LennyProgrammers
@ Lenny222: dalam arti fflush().
peoro
1
Ah, belum sadar, bahwa printf () memerah pada baris baru, berbeda dengan stream C ++.
LennyProgrammers
Karena mereka salah. Ini umumnya merupakan kesalahan pemula
Basile Starynkevitch

Jawaban:

16

Secara umum, ini dilakukan untuk memastikan bahwa pernyataan tersebut dicetak pada baris berikutnya. Jika dilakukan di akhir baris, efek yang sama dapat diturunkan. Ini benar-benar konsekuensi kecil.

Pembaruan : Selama Anda memilih satu cara dan tetap menggunakannya, itu tidak akan menjadi masalah sedikit pun. Jika Anda benar-benar khawatir maka ketikkan semua pernyataan Anda sebagai "\ nHalo \ n". Jika Anda memiliki beberapa baris yang dihancurkan bersama-sama, maka ini benar-benar tidak sulit untuk memperbaiki "bug". Kembali saja dan ubah pernyataan yang menyinggung itu.

Morgan Herlocker
sumber
14
Perbedaannya adalah jika Anda meletakkannya di awal baris, Anda menjamin bahwa itu akan dicetak pada baris baru. Jika Anda bekerja pada basis kode besar mungkin ada garis yang dicetak sebelum Anda yang tidak memiliki baris baru yang ditambahkan.
Robert Anton Reese
1
Ini terutama benar jika Anda menempel pada pernyataan cetak untuk tujuan debugging.
Peter Rowell
2
Oke, tetapi dengan cara ini pesan baru ( "Hello2\n") dapat berakhir di baris yang sama dengan pesan terakhir Anda (berakhir di "\nHelloHello2\n"): bukankah ini seburuk milik Anda message on the same line of the previous one (eg: "\nPrevious-messageHello\n")? Jika dua skenario ini buruk dengan cara yang sama, seorang programmer / proyek harus mengadopsi standar (misalnya: selalu meletakkan '\n'di awal, atau di akhir), tapi saya tidak bisa melihat apa keuntungan yang Anda miliki dengan meletakkan '\n'di awal pesan Anda ...
peoro
@peoro, saya pikir pembaruan saya harus menawarkan solusi jika itu benar-benar mengganggu Anda.
Morgan Herlocker
5

Dua kata: preferensi pribadi. Dalam skema besar, saya pikir ini tidak terlalu penting. Jika Anda terganggu olehnya, tanyakan pada pembuat kode ini mengapa mereka menulisnya seperti itu. Anda mungkin mendapatkan beberapa jawaban menarik.

Saya lebih suka semua karakter baris baru saya di akhir setiap baris.

Bernard
sumber
+1 - Semuanya preferensi. Saya lebih suka baris baru saya di akhir string juga karena tampaknya lebih alami bagi saya
Jetti
Secara pribadi, ketika saya memiliki output yang cukup untuk masalah ini, saya mencoba untuk menjaga semua printfs aktual, couts dan baris baru dalam satu fungsi (mungkin di main ()) sehingga saya dapat mencegah bug konyol terkait dengan hilang / baris baru ekstra . Tapi mungkin aku hanya OCD tentang mereka.
Ixrec
4

Sebagai seseorang yang menggunakan idiom ini dalam beberapa konteks - meskipun saya biasanya meletakkan \ndi akhir untuk memastikan pembilasan -, saya bisa menawarkan pembenaran: Saya cenderung menggunakan ini ketika format banyak baris, terutama jika dimulai dengan baris kosong, sehingga \ns disejajarkan. Ini berarti bahwa agak mudah untuk (a) memeriksa bahwa semua baris memang menyertakan a \natau (b) untuk mengabaikannya sebagai pemberat, dan cukup membaca teks dalam baris. Dalam situasi ini sebenarnya terlihat lebih rapi bagi saya juga, tetapi saya menemukan semua manfaat ini kecil.

Pendekatan alternatif untuk meminimalkan ballast sintaksis adalah dengan menggunakan string literal termasuk baris baru, tetapi 6.4.5 dalam standar C11 melarang mereka, jadi Anda harus berbicara dengan baik kepada kompiler Anda dan berpikir dengan hati-hati tentang apa yang akan dilakukan.

PJTraill
sumber
3

Alasan yang tidak disebutkan (kecuali saya melewatkannya), adalah bahwa beberapa program CLI akan menggunakan '\ r' untuk memperbarui baris berulang kali. Misalnya dengan status.

Baris berikutnya akan membutuhkan baris baru untuk mendapatkan kursor ke, baik, baris berikutnya (baru).

Contoh lain (sangat buruk) adalah ketika programmer menyadari bahwa banyak program dapat menulis ke terminal yang sama. Dalam kasus kacau ini, ada kemungkinan bahwa beberapa perintah akan dikenakan oleh pemimpin '\ n' membilas teks buffered sebelum menulis lebih banyak dan mungkin mengacak output dari penulisan. Tetapi pemesanan semacam itu tidak dijamin, dan cepat atau lambat proses lainnya akan menerobos masuk dan merusak barang-barang. Jangan lakukan ini pada apa pun yang Anda ingin pamerkan kepada ibumu!

Saya akan mencoba untuk menjaga contoh di atas untuk tujuan debugging, dan tidak membuat pengguna selain hasil Anda sendiri. Ini akan berlaku dengan beberapa tugas yang tidak disinkronkan menulis ke file yang sama (semoga debug).

Kasus menggunakan 'r' untuk menulis lebih dari satu baris teks di layar, bagaimanapun, tidak jarang di dunia CLI.

Bagaimanapun, banyak hal terjadi.

Hugh Buntu
sumber