Я слышал, что при использовании вы должны избегать вводить новые строки printf
. Так что вместо printf("\nHello World!")
тебя стоит использоватьprintf("Hello World!\n")
В этом конкретном примере выше это не имеет смысла, поскольку выходные данные будут другими, но учтите это:
printf("Initializing");
init();
printf("\nProcessing");
process_data();
printf("\nExiting");
по сравнению с:
printf("Initializing\n");
init();
printf("Processing\n");
process_data();
printf("Exiting");
Я не вижу никакой выгоды от трейлинга новых строк, кроме того, что он выглядит лучше. Есть ли другая причина?
РЕДАКТИРОВАТЬ:
Я обращаюсь к закрытым голосам здесь и сейчас. Я не думаю, что это относится к переполнению стека, потому что этот вопрос в основном касается дизайна. Я хотел бы также сказать , что , хотя это может быть мнение по этому вопросу, ответ Kilian Фот в и ответ cmaster в доказывает , что на самом деле есть очень объективные преимущества с одним подходом.
init()
иprocess_data()
печатать что-нибудь самим? Как бы вы ожидали, что результат будет выглядеть, если они сделали?\n
это линия терминатора , не линия сепаратора . Об этом свидетельствует тот факт, что текстовые файлы в UNIX почти всегда заканчиваются на\n
.Ответы:
Достаточное количество терминальных операций ввода-вывода буферизуется строкой , поэтому, заканчивая сообщение \ n, вы можете быть уверены, что оно будет отображаться своевременно. С начальным \ n сообщение может отображаться или не отображаться сразу. Часто это будет означать, что каждый шаг отображает сообщение о ходе выполнения предыдущего шага, что не вызывает путаницы и лишнего времени, когда вы пытаетесь понять поведение программы.
источник
fprintf(STDERR, …)
вместо этого, который вообще не буферизируется для диагностического вывода.В системах POSIX (в основном в любом Linux, BSD, в любой системе с открытым исходным кодом, которую вы можете найти) строка определяется как строка символов, оканчивающаяся символом новой строки
\n
. Это основное предположение все стандартные инструменты командной строки опираться, в том числе (но не ограничиваясь ими)wc
,grep
,sed
,awk
, иvim
. Это также причина, по которой некоторые редакторы (напримерvim
) всегда добавляют\n
в конце файла, и почему более ранние стандарты C требовали, чтобы заголовки заканчивались\n
символом.Кстати: наличие
\n
завершенных строк значительно упрощает обработку текста: вы точно знаете, что у вас есть полная строка, когда у вас есть этот терминатор. И вы точно знаете, что вам нужно смотреть на большее количество символов, если вы еще не сталкивались с этим терминатором.Конечно, это на стороне ввода программ, но вывод программы очень часто снова используется как ввод программы. Таким образом, ваш вывод должен придерживаться соглашения для обеспечения беспрепятственного ввода в другие программы.
источник
В дополнение к тому, что упомянули другие, я чувствую, что есть гораздо более простая причина: это стандарт. Всякий раз, когда что-либо печатается в STDOUT, оно почти всегда предполагает, что оно уже находится на новой строке, и, следовательно, не нужно начинать новую. Также предполагается, что следующая записываемая строка будет действовать аналогичным образом, поэтому полезно завершить ее, начав новую строку.
Если вы выводите строки, начинающиеся с новой строки, чередующиеся со стандартными строками с конечной новой строкой, «в конечном итоге это будет выглядеть так:
... что, по-видимому, не то, что вы хотите.
Если вы используете только начальные символы новой строки в своем коде и запускаете его только в IDE, это может оказаться нормальным. Как только вы запустите его в терминале или введете чужой код, который будет писать в STDOUT вместе с вашим кодом, вы увидите нежелательный вывод, как описано выше.
источник
$PS1
, который будет раздражать обычные программы.Поскольку ответы с большим количеством голосов уже дали отличные технические причины, по которым следует отдавать предпочтение завершающим переводам строк, я подойду к этому с другой стороны.
По моему мнению, следующее делает программу более читабельной:
Исходя из вышеперечисленных пунктов, мы можем утверждать, что последние строки лучше. Новые строки форматируют «шум» по сравнению с сообщением, сообщение должно выделяться и, следовательно, должно стоять первым (подсветка синтаксиса также может помочь).
источник
"ok\n"
это намного лучше, чем"\nok"
..."\pFoobar"
.Использование завершающих строк новой строки упрощает последующие модификации.
В качестве (очень тривиального) примера, основанного на коде OP, предположим, что вам нужно произвести некоторый вывод перед сообщением «Initializing», и этот вывод происходит из другой логической части кода, в другом исходном файле.
Когда вы запускаете первый тест и обнаруживаете, что «Инициализация» теперь добавляется в конец строки какого-либо другого вывода, вы должны выполнить поиск в коде, чтобы найти, где он был напечатан, и затем надеяться изменить «Инициализация» на «\ nИнициализация». "не портит формат чего-то другого, при других обстоятельствах.
Теперь рассмотрим, как будет обрабатываться тот факт, что ваш новый вывод на самом деле является необязательным, поэтому ваше изменение "\ nInitializing" иногда приводит к появлению нежелательной пустой строки в начале вывода ...
Вы устанавливаете глобальный ( шок ужас ?? !!! ) флаг, указывающий, был ли какой-либо предыдущий вывод, и проверяете его на вывод «Initializing» с необязательным начальным «\ n», или вы выводите «\ n» вместе с ваш предыдущий вывод и будущие читатели кода задаются вопросом, почему эта «Инициализация» не имеет лидирующего «\ n», как все остальные выходные сообщения?
Если вы последовательно выводите завершающие символы новой строки, в точке, в которой вы знаете, что достигли конца строки, которую необходимо завершить, вы обойдете все эти проблемы. Обратите внимание, что для этого может потребоваться отдельный оператор put ("\ n") в конце некоторой логики, которая выводит строку по частям, но дело в том, что вы выводите новую строку в самом раннем месте кода, где вы знаете, что вам нужно сделай это, а не где-нибудь еще.
источник
Точно соответствует C spec.
Библиотека C определяет линию как заканчивается с новой строки
'\n'
.Код, который записывает данные в виде строк, будет соответствовать этой концепции библиотеки.
Re: последняя строка требует завершающего символа новой строки . Я бы порекомендовал всегда писать финал
'\n'
на выходе и терпеть его отсутствие на входе.Проверка орфографии
Моя проверка орфографии жалуется. Возможно, ты тоже.
источник
ispell.el
улучшился, чтобы справиться с этим лучше. Я признаю, что чаще всего\t
это была проблема, и ее можно было избежать, просто разбив строку на несколько токенов, но это был всего лишь побочный эффект более общей «игнорирующей» работы, чтобы выборочно пропустить нетекстовые части HTML или MIME составные части и части кода без комментариев. Я всегда хотел распространить это на переключение языков, где есть соответствующие метаданные (например,<p lang="de_AT">
илиContent-Language: gd
), но никогда не получал Round Tuit. И сопровождающий сразу отклонил мой патч. :-(ispell.el
.Лидирующие символы новой строки часто облегчают написание кода, когда есть условные выражения, например:
(Но, как было отмечено в другом месте, вам может потребоваться очистить буфер вывода перед выполнением каких-либо шагов, которые занимают много времени процессора.)
Следовательно, можно сделать хороший пример для обоих способов сделать это, однако лично мне не нравится printf (), и я использовал бы собственный класс для создания вывода.
источник
"\nProcessing"
.printf
. Что, если вы хотите обусловить всю строку «Initializing»? Вы должны были бы включить строку «Procesing» в это условие, чтобы знать, стоит ли вам добавлять префикс новой строки или нет. Если впереди еще один отпечаток, и вам нужно условно обработать строку «Обработка», вам также необходимо включить следующий отпечаток в это условие, чтобы узнать, нужно ли ставить префикс с новым переводом строки и т. Д. Для каждого отпечатка.if ((addr & 0x0F)==0) printf("\n%08X:", addr);
и безоговорочно добавить новую строку в вывод в конце, чем использовать отдельный код для заголовка каждой строки и завершающего символа новой строки.Ведущие перевода строки не работают хорошо с другими функциями библиотеки, в частности
puts()
иperror
в стандартной библиотеке, но и любой другой библиотеки , вы , вероятно, использовать.Если вы хотите напечатать предварительно написанную строку (либо константу, либо уже отформатированную, например, с помощью
sprintf()
), тоputs()
это естественный (и эффективный) выбор. Однако нет возможностиputs()
завершить предыдущую строку и написать неопределенную строку - она всегда записывает терминатор строки.источник