Какое использование escape-последовательности '\ r'?
У меня есть код C следующим образом:
#include<stdio.h>
int main()
{
printf("Hey this is my first hello world \r");
return 0;
}
Я использовал escape-последовательность \r
в качестве эксперимента. Когда я запускаю код, я получаю вывод как:
o world
Почему это, и что такое использование \r
точно?
Если я запускаю тот же код в онлайн-компиляторе, я получаю вывод как:
Hey this is my first hello world
Почему онлайн-компилятор выдал другой вывод, игнорируя \r
?
Ответы
Ответ 1
\r
- символ возврата каретки; он сообщает вашему эмулятору терминала перемещать курсор в начале строки.
Курсор - это позиция, в которой будут отображаться следующие символы.
Итак, печать \r
позволяет переопределить текущую строку эмулятора терминала.
Tom Zych понял, почему вывод вашей программы o wolrd
, в то время как \r
находится в конце строки, и вы ничего не печатаете после что:
Когда ваша программа завершается, оболочка печатает командную строку. Терминал отображает его, где вы оставили курсор. Ваша программа оставляет курсор в начале строки, поэтому командная строка частично переопределяет напечатанную строку. Это объясняет, почему вы увидели свое командное приглашение, а затем o world
.
В онлайн-компиляторе вы просто печатаете исходный вывод в браузере. Браузер игнорирует управляющие символы, поэтому \r
не имеет эффекта.
См. https://en.wikipedia.org/wiki/Carriage_return
Вот пример использования \r
:
#include <stdio.h>
#include <unistd.h>
int main()
{
char chars[] = {'-', '\\', '|', '/'};
unsigned int i;
for (i = 0; ; ++i) {
printf("%c\r", chars[i % sizeof(chars)]);
fflush(stdout);
usleep(200000);
}
return 0;
}
Он повторно печатает символы -
\
|
/
в том же положении, чтобы создать иллюзию вращения |
в терминале.
Ответ 2
Программа печатает "Hey this is my first hello world "
, затем переводит курсор обратно в начало строки. Как это будет выглядеть на экране, зависит от вашей среды. Похоже, начало строки перезаписывается чем-то, возможно, в командной строке.
Ответ 3
"\ r" означает "Возврат каретки" - это перерыв со времен пишущих машинок и действительно старых принтеров. Лучший пример - в Windows и других ОС DOSsy, где новая строка задается как "\ r\n". Это инструкции, отправленные на старый принтер для запуска новой строки: сначала переместите печатающую головку назад в начало, затем опустите ее.
Различные операционные системы будут использовать другие последовательности новой строки. Linux и OSX просто используют "\n". Старые Mac-приложения просто используют '\ r'. Wikipedia имеет более полный список, но это важные.
Надеюсь, это поможет!
PS: Что касается того, почему вы получаете этот странный вывод... Возможно, консоль перемещает "курсор" обратно в начало строки, а затем перезаписывает первый бит пробелами или суммирует.
Ответ 4
\r
переместите курсор к началу строки.
Разрывы строк управляются по-разному в разных системах. Некоторые используют только \n
(линейный канал, например Unix), некоторые используют (\r
например, MacOS до OS X afaik), а некоторые используют \r\n
(например, Windows afaik).
Ответ 5
Как сказано в сообщении amaud576875, escape-последовательность \r
означает возврат каретки, аналогичный нажатию клавиши Enter. Однако я не уверен, как вы получаете "мир"; вы должны (и я) получить "мой первый мир привет", а затем новую строку. В зависимости от того, какую операционную систему вы используете (я использую Mac), вы можете использовать \n
вместо \r
.
Ответ 6
Это от устаревшей технологии: стиль печатной машины старой моды. Был ролик (валик), который продвигал бумагу и печатающую головку, которая забила металлический ключ против чернильной ткани.
\ r Верните печатающую головку влево.
\n Передвиньте валик в одну строку.
Если\n не был выпущен, вы должны набрать то, что было на линии (используется в основном для подчеркивания текста).
Ответ 7
Чтобы ответить на часть вашего вопроса,
что используется \r
?
Многие интернет-протоколы, такие как FTP, HTTP и SMTP, указываются в терминах строк, ограниченных возвратом каретки и новой линией. Так, например, при отправке электронной почты у вас может быть код, например:
fprintf(socket, "RCPT TO: %s\r\n", recipients);
Или, когда FTP-сервер отвечает с ошибкой, запрещенной правами:
fprintf(client, "550 Permission denied\r\n");
Ответ 8
Это очень полезно, когда вы работаете на платформе unix и вам нужно создать текстовый файл
который будет открыт на платформе dos.
Unix использует '\n' в качестве своего терминатора строк, а dos использует '\ r\n' в качестве своего терминатора строк, поэтому вы можете использовать его для создания текстового файла dos.