Використання b і r в C

\b and \r are rarely used in practice. I just found out that I misunderstood these two escape sequences. A simple test:

printf("foo\bbar\n");

I expected it to output fobar, because \b will backspace the cursor, and b will overwrite the second o, but instead it outputs: foobar

Те ж саме з r :

printf("foo\rbar\n");

Я подумав, що r перемістить курсор на початок поточного рядка, так що bar замінить foo , тому кінцевий результат має бути код> бар . Однак це фактично:

foo
bar
42
У рядку це просто ASCII 8 і 13 CR. Стара смарт-консоль могла б інтерпретувати їх як команди (див. Також Unix curls). Загалом r може бути інтерпретовано як розрив рядка. Насправді ви знайшли два найбільш непотрібні символи.
додано Автор Joop Eggen, джерело
У рядку це просто ASCII 8 і 13 CR. Стара смарт-консоль могла б інтерпретувати їх як команди (див. Також Unix curls). Загалом r може бути інтерпретовано як розрив рядка. Насправді ви знайшли два найбільш непотрібні символи.
додано Автор Joop Eggen, джерело
У рядку це просто ASCII 8 і 13 CR. Стара смарт-консоль могла б інтерпретувати їх як команди (див. Також Unix curls). Загалом r може бути інтерпретовано як розрив рядка. Насправді ви знайшли два найбільш непотрібні символи.
додано Автор Joop Eggen, джерело
@Chris, що саме робить b і r ?
додано Автор Yu Hao, джерело
@Chris, що саме робить b і r ?
додано Автор Yu Hao, джерело
@suspectus Я скористався онлайновою gcc
додано Автор Yu Hao, джерело
@suspectus Я скористався онлайновою gcc
додано Автор Yu Hao, джерело
@suspectus Я скористався онлайновою gcc
додано Автор Yu Hao, джерело
@YuHao Вони нічого не роблять. Вони просто символи. Але все, що ви пишете ці символи, може діяти певним чином, коли він отримує ці символи. напр. якщо ви пишете ці символи у файл, символ закінчиться у файлі. Якщо ви запишете його в термінал/консоль, термінал може стерти символ, коли він побачить, що деякі термінали будуть робити це, деякі не будуть.
додано Автор nos, джерело
@YuHao Вони нічого не роблять. Вони просто символи. Але все, що ви пишете ці символи, може діяти певним чином, коли він отримує ці символи. напр. якщо ви пишете ці символи у файл, символ закінчиться у файлі. Якщо ви запишете його в термінал/консоль, термінал може стерти символ, коли він побачить, що деякі термінали будуть робити це, деякі не будуть.
додано Автор nos, джерело
на якій платформі ви знаходитесь?
додано Автор suspectus, джерело
на якій платформі ви знаходитесь?
додано Автор suspectus, джерело
додано Автор ctn, джерело
додано Автор ctn, джерело
додано Автор ctn, джерело
Де це питання?
додано Автор Chris, джерело
Де це питання?
додано Автор Chris, джерело

8 Відповіді

Символи будуть надсилатися так само, як на базовий вихідний пристрій (у вашому випадку це можливо емулятор терміналу).

Від виконання терміналу залежить те, як ці символи відображаються. Наприклад, дзвінок ( a ) може викликати звуковий сигнал на деяких терміналах, спалах екрана на інших або повністю ігнорується. Все залежить від налаштування терміналу.

50
додано
Ви знаєте, як налаштувати шахту, так що він не ігнорує дзвін (а) ??
додано Автор mf_, джерело

Символи будуть надсилатися так само, як на базовий вихідний пристрій (у вашому випадку це можливо емулятор терміналу).

Від виконання терміналу залежить те, як ці символи відображаються. Наприклад, дзвінок ( a ) може викликати звуковий сигнал на деяких терміналах, спалах екрана на інших або повністю ігнорується. Все залежить від налаштування терміналу.

50
додано
Ви знаєте, як налаштувати шахту, так що він не ігнорує дзвін (а) ??
додано Автор mf_, джерело

Символи будуть надсилатися так само, як на базовий вихідний пристрій (у вашому випадку це можливо емулятор терміналу).

Від виконання терміналу залежить те, як ці символи відображаються. Наприклад, дзвінок ( a ) може викликати звуковий сигнал на деяких терміналах, спалах екрана на інших або повністю ігнорується. Все залежить від налаштування терміналу.

50
додано
Ви знаєте, як налаштувати шахту, так що він не ігнорує дзвін (а) ??
додано Автор mf_, джерело

Символи знаходяться точно так, як задокументовані - b прирівнюється до символьного коду 0x08 і . Різниця в тому, як ваша операційна система реагує на ці символи. Назад, коли дисплеї намагалися емулювати старий телетайп, ці дії були стандартизовані, але вони менш корисні в сучасних середовищах і сумісність не гарантується.

9
додано
Стандарт не говорить про коди символів. b буде 0x08 , лише якщо 0x08 відповідає символу зворотного ходу в наборі символів виконання (що справедливо в ASCII і Unicode та інших загальних наборів символів). Якщо ваш набір символів виконання EBCDIC, то b відображатиметься на 0x16 (якщо я можу довіряти таблицям символів, які я знаходжу в Інтернеті).
додано Автор Adrian McCarthy, джерело

Символи знаходяться точно так, як задокументовані - b прирівнюється до символьного коду 0x08 і . Різниця в тому, як ваша операційна система реагує на ці символи. Назад, коли дисплеї намагалися емулювати старий телетайп, ці дії були стандартизовані, але вони менш корисні в сучасних середовищах і сумісність не гарантується.

9
додано
Стандарт не говорить про коди символів. b буде 0x08 , лише якщо 0x08 відповідає символу зворотного ходу в наборі символів виконання (що справедливо в ASCII і Unicode та інших загальних наборів символів). Якщо ваш набір символів виконання EBCDIC, то b відображатиметься на 0x16 (якщо я можу довіряти таблицям символів, які я знаходжу в Інтернеті).
додано Автор Adrian McCarthy, джерело

Інтерпретація символів повернення та повернення каретки залишається для програмного забезпечення, яке використовується для відображення. Емулятор терміналу при відображенні b переміщує курсор на один крок назад, а при відображенні r - до початку рядка. Якщо ви друкуєте ці символи в іншому місці, наприклад, у текстовому файлі, програмне забезпечення може вибрати. робити щось інше.

4
додано

Що стосується значення кожного символу, описаного в C Primer Plus, те, що ви очікували, є "правильною" відповіддю. Це повинно бути вірно для деяких комп'ютерних архітектур і компіляторів, але, на жаль, не ваше.

I wrote a simple c program to repeat your test, and got that 'correct' answer. I was using Mac OS and gcc. enter image description here

Крім того, мені дуже цікаво, який компілятор ви використовуєте. :)

1
додано
Будь ласка, напишіть код як код; не зображення
додано Автор Prateek, джерело

I have experimented many of the backslash escape characters. \n which is a new line feed can be put anywhere to bring the effect. One important thing to remember while using this character is that the operating system of the machine we are using might affect the output. As an example, I have printed a bunch of escape character and displayed the result as follow to proof that the OS will affect the output.

0
додано
Коди повинні бути тексту, ви можете вставити зображення для виводу, які не можуть бути розміщені тут, очевидно, як це не буде відображатися, як на локальних машинах
додано Автор Prateek, джерело