Tại sao mọi người đặt '\ n' ở đầu chuỗi?


8

Rất thường xuyên tôi nhận được vào mã C nơi printfchuỗi định dạng bắt đầu bằng \n:

printf ("\ nHello");

Theo tôi đây là một điều khó chịu không mang lại lợi thế (khá nhiều nhược điểm!) Đối với việc in ấn "Hello\n":

  • Nếu dòng in đầu tiên bắt đầu bằng '\n', đầu ra chương trình sẽ bắt đầu bằng một dòng trống (vô dụng)
  • Nếu dòng in cuối cùng không kết thúc '\n', đầu ra chương trình sẽ không kết thúc bằng một dòng mới (hữu ích khi đọc đầu ra trên thiết bị đầu cuối)
  • Trên hầu hết các thiết bị đầu cuối (nói chung là các luồng được đệm trong dòng), đầu ra bị xóa khi '\n'gặp phải, do đó, một dòng không kết thúc có '\n'thể được hiển thị trên màn hình nhiều lần sau khi nó thực sự bị printf'(hoặc có thể không bao giờ, nếu luồng không bao giờ bị xóa , ví dụ nếu chương trình gặp sự cố)

Vì vậy, tại sao mọi người thích điều này?


2
Đây là một điều nhỏ thực sự làm tôi khó chịu. Những người làm cout << endl << ..; cũng làm tôi phát điên Tôi biết không có gì khác biệt nhưng ...
Vitor Py

Bạn có nghĩa là "tuôn ra" theo nghĩa "dòng mới" hoặc như trong fflush ()?
LennyProgrammer

@ Lenny222: theo nghĩa của fflush().
peoro

1
À, chưa nhận ra, printf () tuôn ra trên dòng mới, trái ngược với luồng C ++.
LennyProgrammer

Vì họ sai. Nó thường là một lỗi người mới
Basile Starynkevitch

Câu trả lời:


16

Nói chung, nó được thực hiện để đảm bảo rằng câu lệnh được in trên dòng tiếp theo. Nếu nó được thực hiện ở cuối dòng, hiệu ứng tương tự có thể được bắt nguồn. Nó thực sự là ít hậu quả.

Cập nhật : Miễn là bạn chọn một cách và gắn bó với nó, điều đó thực sự sẽ không thành vấn đề một chút nào. Nếu bạn thực sự lo lắng thì hãy nhập tất cả các câu của bạn là "\ nHello \ n". Nếu bạn có một số dòng trộn lẫn với nhau, thì đây thực sự không phải là một "lỗi" khó sửa. Chỉ cần quay lại và thay đổi tuyên bố vi phạm.


14
Sự khác biệt là nếu bạn đặt nó ở đầu dòng bạn đảm bảo rằng nó sẽ in ra trên một dòng mới. Nếu bạn đang làm việc trên một cơ sở mã lớn, có thể có một dòng in ra trước khi dòng của bạn không có dòng mới được thêm vào nó.
Robert Anton Reese

1
Điều này đặc biệt đúng nếu bạn đang sử dụng các câu lệnh in cho mục đích gỡ lỗi.
Peter Rowell

2
Ok, nhưng theo cách này, một tin nhắn mới ( "Hello2\n") có thể kết thúc trên cùng một dòng của tin nhắn cuối cùng của bạn (kết thúc bằng "\nHelloHello2\n"): điều này có tệ như bạn có message on the same line of the previous one (eg: "\nPrevious-messageHello\n"không? Nếu hai kịch bản này xấu theo cùng một cách, một lập trình viên / dự án nên áp dụng một tiêu chuẩn (ví dụ: luôn đặt '\n'ở đầu hoặc cuối), nhưng tôi không thể thấy những lợi thế nào bạn có thể có '\n'khi bắt đầu trong số các tin nhắn của bạn ...
peoro

@peoro, tôi nghĩ bản cập nhật của tôi sẽ cung cấp một giải pháp nếu nó thực sự làm phiền bạn.
Morgan Herlocker

5

Hai từ: sở thích cá nhân. Trong sơ đồ lớn của mọi thứ, tôi không nghĩ rằng điều này thực sự quan trọng. Nếu bạn thấy khó chịu vì điều đó, hãy hỏi tác giả của mã này tại sao họ viết nó như thế. Bạn có thể nhận được một số câu trả lời thú vị.

Tôi thích tất cả các ký tự dòng mới của tôi ở cuối mỗi dòng.


+1 - Đó là tất cả các ưu tiên. Tôi cũng thích dòng mới của mình ở cuối chuỗi vì nó có vẻ tự nhiên hơn đối với tôi
Jetti

Cá nhân, khi tôi có đủ đầu ra cho vấn đề này, tôi cố gắng giữ tất cả các bản in, cout và dòng mới thực tế trong một chức năng duy nhất (có thể là chính ()) để tôi có thể ngăn chặn mọi lỗi ngớ ngẩn liên quan đến thiếu / thêm dòng mới . Nhưng có lẽ tôi chỉ là OCD về họ.
Ixrec

4

Là một người sử dụng thành ngữ này trong một số ngữ cảnh - mặc dù tôi thường đặt \nở cuối để đảm bảo xả nước - tôi có thể đưa ra một lời biện minh: Tôi có xu hướng sử dụng điều này khi định dạng nhiều dòng, đặc biệt là nếu bắt đầu bằng một dòng trống, để \ns được căn chỉnh. Điều này có nghĩa là (a) kiểm tra dễ dàng hơn rằng tất cả các dòng thực sự bao gồm a \nhoặc (b) để bỏ qua chúng là dằn, và chỉ đọc văn bản trong các dòng. Trong tình huống này, nó thực sự trông gọn gàng hơn đối với tôi, nhưng tôi thấy tất cả những lợi ích này không đáng kể.

Một cách tiếp cận khác để giảm thiểu chấn lưu cú pháp là sử dụng chuỗi ký tự bao gồm các dòng mới, nhưng 6.4.5 trong tiêu chuẩn C11 cấm chúng, vì vậy bạn phải nói độc đáo với trình biên dịch của mình và suy nghĩ cẩn thận về những gì nó sẽ làm.


3

Một lý do không được đề cập (trừ khi tôi bỏ lỡ), là một số chương trình CLI sẽ sử dụng '\ r' để liên tục cập nhật một dòng. Ví dụ, với trạng thái.

Dòng tiếp theo sẽ yêu cầu một dòng mới để đưa con trỏ đến, tốt, dòng tiếp theo (mới).

Một ví dụ khác (rất tệ) là nơi lập trình viên nhận thức được rằng nhiều chương trình có thể được ghi vào cùng một thiết bị đầu cuối. Trong trường hợp hỗn loạn này, có khả năng một số thứ tự sẽ được áp đặt bằng cách xóa 'văn bản đệm' hàng đầu trước khi viết nhiều hơn và có thể làm xáo trộn kết quả đầu ra của ghi. Nhưng thứ tự như vậy không được đảm bảo, và sớm hay muộn quá trình khác sẽ đâm sầm vào và phá hỏng mọi thứ. Đừng làm điều này trên bất cứ điều gì bạn muốn thể hiện với mẹ của bạn!

Tôi sẽ cố gắng giữ ví dụ trên cho mục đích gỡ lỗi và không cho người dùng khác ngoài chính bạn vào kết quả. Điều này sẽ áp dụng với nhiều tác vụ không đồng bộ ghi vào cùng một tệp (hy vọng gỡ lỗi).

Tuy nhiên, trường hợp sử dụng '\ r' để viết trên một dòng văn bản trên màn hình, tuy nhiên, không phải là hiếm trong thế giới CLI.

Chuyện xảy ra, sau tất cả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.