Какая польза от escape-последовательности '\ r'? - PullRequest
51 голосов
/ 10 сентября 2011

У меня есть такой код 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?

Ответы [ 8 ]

79 голосов
/ 10 сентября 2011

\r - это символ возврата каретки ; он говорит эмулятору терминала перемещать курсор в начале строки.

Курсор - это позиция, в которой будут отображаться следующие символы.

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

Том Зыч понял, почему вывод вашей программы o world, тогда как \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;
}

Он многократно печатает символы - \ | / в одной и той же позиции, создавая иллюзию вращения | в терминале.

22 голосов
/ 10 сентября 2011

Программа печатает "Hey this is my first hello world ", затем перемещает курсор назад к началу строки. Как это будет выглядеть на экране, зависит от вашей среды. Похоже, что начало строки что-то перезаписывает, возможно, приглашение командной строки.

8 голосов
/ 10 сентября 2011

«\ r» означает «Возврат каретки» - это пережиток времен пишущих машинок и действительно старых принтеров.Лучший пример - в Windows и других ОС DOSsy, где символ новой строки обозначается как "\ r \ n".Это инструкции, отправленные старому принтеру для начала новой строки: сначала переместите печатающую головку обратно в начало, а затем - на одну.

В разных ОС используются другие последовательности новой строки.Linux и OSX просто используют '\ n'.Старые Mac OS просто используют '\ r'. Википедия имеет более полный список, но это важные.

Надеюсь, это поможет!

PS: А почему вы получаете этот странный вывод ... Возможноконсоль перемещает курсор назад к началу строки, а затем перезаписывает первый бит пробелами или суммированием.

6 голосов
/ 10 сентября 2011

\r переместить курсор в начало строки.

В разных системах разрывы строк обрабатываются по-разному.Некоторые используют только \n (перевод строки, например, Unix), некоторые используют (\r, например, MacOS до OS X afaik), а некоторые используют \r\n (например, Windows afaik).

2 голосов
/ 17 марта 2016

Чтобы ответить на часть вашего вопроса,

какая польза от \r?

Многие интернет-протоколы, такие как FTP, HTTP и SMTP,указаны в виде строк, разделенных переводом каретки и переводом строки.Так, например, при отправке электронного письма у вас может быть такой код:

fprintf(socket, "RCPT TO: %s\r\n", recipients);

Или, когда FTP-сервер отвечает с ошибкой, в которой отказано в разрешении:

fprintf(client, "550 Permission denied\r\n");
2 голосов
/ 10 сентября 2011

Это от устаревшей технологии: старая мода печатной машинки. Был валик (валик), который продвигал бумагу, и печатающая головка, которая вбивала металлический ключ в чернильную ткань.

\ r Верните печатающую головку влево.

\ n Продвиньте валик на одну строку.

Если \ n не было введено, вы должны набрать то, что было в строке (используется в основном для подчеркивания текста).

2 голосов
/ 10 сентября 2011

Как сказал amaud576875, escape-последовательность \r означает возврат каретки, аналогично нажатию клавиши Enter.Тем не менее, я не уверен, как вы получаете "о мире";Вы должны (и я) получить "мой первый привет мир", а затем новую строку.В зависимости от того, какую операционную систему вы используете (я использую Mac), вы можете использовать \n вместо \r.

1 голос
/ 10 сентября 2011

Это очень полезно, когда вы работаете на платформе Unix, и вам нужно создать текстовый файл, который будет открыт на платформе DOS.

Unix использует '\ n' в качестве ограничителя строки,и dos использует '\ r \ n' в качестве ограничителя строки, так что вы можете использовать его для создания текстового файла dos.

...