Вопрос

В чем разница между \n (новая строка) и \r (возврат каретки)?

В частности, существуют ли какие-либо практичный различия между \n и \r?Есть ли места, где одно следует использовать вместо другого?

Это было полезно?

Решение

С точки зрения ascii-кода, это 3 - поскольку они равны 10 и 13 соответственно;-).

Но если серьезно, то существует множество:

  • в Unix и всех Unix-подобных системах, \n является ли код для end-of-line, \r не означает ничего особенного
  • как следствие, в C и большинстве языков, которые каким-то образом копируют его (даже удаленно), \n является стандартной escape-последовательностью для конца строки (переводится в / из специфичных для операционной системы последовательностей по мере необходимости)
  • в старых системах Mac (до OS X), \r был ли код для end-of-line вместо
  • в Windows (и многих старых операционных системах) код для обозначения конца строки состоит из 2 символов, \r\n, в таком порядке
  • как (удивительное;-) следствие (возвращаясь к операционным системам, намного более старым, чем Windows), \r\n является стандартным завершением строки для текстовых форматов в Интернете
  • для электромеханических "терминалов" типа телетайпа, \r командует каретке двигаться назад влево до тех пор, пока она не достигнет крайнего левого упора (медленная операция), \n командует ролику свернуть одну строку (гораздо более быстрая операция) - вот почему у вас всегда есть \r до того , как \n, чтобы ролик мог двигаться, пока каретка все еще движется влево!-) В Википедии есть более подробное объяснение.
  • для терминалов символьного режима (обычно эмулирующих еще более старые печатные терминалы, как указано выше), в режиме raw, \r и \n действуйте аналогично (за исключением того, что касается курсора, так как там является нет каретки или ролика;-)

На практике, в современном контексте записи в текстовый файл, вы всегда должны использовать \n (базовая среда выполнения переведет это, если вы используете странную ОС, например, Windows;-).Единственная причина использовать \r это если вы пишете на символьный терминал (или, что более вероятно, в "окно консоли", эмулирующее его) и хотите, чтобы следующая строка, которую вы пишете, перезаписывала последнюю, которую вы только что написали (иногда используется для дурацких эффектов "анимации ascii", напримериндикаторы выполнения) - однако в мире графических интерфейсов это становится довольно устаревшим;-).

Другие советы

Исторически сложилось так , что \n использовался для перемещения каретки вниз, в то время как \r использовался для перемещения каретки обратно в левую часть страницы.

Два разных персонажа.

\n используется в качестве символа окончания строки в текстовых файлах Unix

\r используется в качестве символа окончания строки в текстовых файлах Mac

\r\n (т.е. оба) используются для завершения строк в текстовых файлах Windows и DOS.

Поскольку никто больше не упоминал об этом конкретно (они слишком молоды, чтобы знать / помнить?) - я подозреваю, что использование \r\n создан для пишущих машинок и подобных устройств.

Когда вам требовалась новая строка при использовании многострочной пишущей машинки, она должна была выполнять два физических действия:переместите каретку обратно в начало (слева, в США) страницы и подайте бумагу на одну выемку вверх.

Например, во времена линейных принтеров единственным способом выделения текста жирным шрифтом было выполнить возврат каретки БЕЗ перевода строки и напечатать те же символы поверх старых, добавив больше чернил, что сделало текст более темным (выделено жирным шрифтом).Когда в пишущей машинке произошел сбой механической функции "перевод строки", это стало досадным результатом:вы могли бы ввести текст поверх предыдущей строки текста, если бы не обращали внимания.

Два разных символа для разных операционных систем. Также это играет определенную роль в данных, передаваемых по TCP/IP который требует использования \r\n.

\n Unix - система

\r Mac

\r\n Windows и DOS.

Для завершения,

В сценарии оболочки (bash) вы можете использовать \r чтобы отправить курсор, перед строкой и, конечно \n чтобы навести курсор на новую строку.

Например, попробуйте :

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • Первый дисплей "echo" AA--AA
  • Второй : AA--AABB
  • Последний : BB--AABB

Но не забывайте использовать -en в качестве параметров.

В Windows символ перемещается в начало следующей строки.Символ перемещается в начало текущей строки, не переходя к следующей строке.Я использовал \ r в своих собственных консольных приложениях, где я тестирую некоторый код, и я не хочу видеть текст, прокручивающийся по экрану, поэтому вместо использования \ n после распечатки некоторого текста, скажем, частоты кадров (FPS), я буду печатать f("%-10d \ r", fps);Это вернет курсор в начало строки, не переходя к следующей строке, и позволит мне отображать другую информацию на экране, которая не прокручивается, в то время как частота кадров постоянно обновляется в одной и той же строке (%-10 гарантирует, что вывод состоит как минимум из 10 символов, выровненных по левому краю, поэтому в конечном итоге он дополняется пробелами, перезаписывая все старые значения для этой строки).Это довольно удобно для подобных вещей, обычно, когда у меня есть отладочный материал, выводимый на экран моей консоли.

Немного истории

Символ /r расшифровывается как "return" или "возврат каретки", который обязан своей историей пишущей машинке.Возврат каретки переместил вашу каретку полностью вправо, так что вы печатали в начале строки.

Символ /n означает "новая строка", опять же, начиная с typewriter days, вы перешли на новую строку.Однако это необязательно с самого начала, вот почему некоторые операционные системы приняли необходимость возврата a / r с последующим переводом строки a / n, поскольку именно в таком порядке это делала пишущая машинка.Это также объясняет старые 8-разрядные компьютеры, на которых раньше было "Return", а не "Enter", из "возврата каретки", который был знаком.

#include <stdio.h>

void main()
{
  int countch=0;
  int countwd=1;

  printf("Enter your sentence in lowercase: ");
  char ch='a';
  while(ch!='\r')
  {
    ch=getche();
    if(ch==' ')
      countwd++;
    else
      countch++;
  }

  printf("\n Words = ",countwd);

  printf("Characters = ",countch-1);

  getch();

}

давайте возьмем этот пример, попробуем поставить вместо , это не сработает, и попытаемся угадать, почему?

Просто чтобы добавить путаницы, я работал над простым текстовым редактором, используя элемент TextArea на HTML-странице в браузере.В ожидании проблем с совместимостью в отношении CR / LF я написал код для проверки платформы и использования любого соглашения о переводе строки, применимого к платформе.

Однако я обнаружил кое-что интересное при проверке фактический символы, содержащиеся в текстовой области, с помощью небольшой функции JavaScript, которая генерирует шестнадцатеричные данные, соответствующие символам.

Для теста я набрал следующий текст:

Привет, Мир [входит]

Прощай, Жестокий Мир [входит]

Когда я изучил текстовые данные, последовательность байтов, которую я получил, была такой:

48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 0a 47 6f 6f 64 62 79 65 2c 20 43 72 75 65 6c 20 57 6f 72 6c 64 0a

Теперь, большинство людей, смотрящих на это и видящих 0a, но не 0d байт, подумали бы, что этот вывод был получен на платформе Unix / Linux.Но вот в чем загвоздка:эту последовательность я получил в Google Chrome на 64-разрядной версии Windows 7.

Итак, если вы используете элемент TextArea и просматриваете текст, ПРОВЕРЬТЕ выходные данные, как я сделал выше, чтобы убедиться, какие фактические символьные байты возвращаются из вашего TextArea.Мне еще предстоит выяснить, отличается ли это на других платформах или в других браузерах, но это стоит иметь в виду, если вы выполняете обработку текста с помощью JavaScript, и вам нужно сделать эту платформу обработки текста независимой.

Соглашения, описанные в вышеприведенных сообщениях, применяются к консоль вывод, но HTML-элементы, похоже, соответствуют соглашению UNIX / Linux.Если только кто-то не обнаружит иного на другой платформе / браузере.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top