Подтвердить что ты не робот

Какое использование 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?

4b9b3361

Ответ 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.