2013-12-09 1 views
4
#include <stdio.h> 

void main() 
{ 
    printf("ab"); 
    printf("\bsi"); 
    printf("\rha"); 
} 

этого код дает выход «га» на GCC 4.8 компилятораПочему и как отображаются следующие результаты, связанные с возвратом каретки?

#include <stdio.h> 

void main() 
{ 
    printf("ab"); 
    printf("\bsi"); 
    printf("\rha"); 
    printf("\n"); 
} 

этот код дает выход «хай» на GCC 4.8 компилятора

теперь вопрос в том, почему выходе перейти от «ha» к «hai» только при добавлении выражения printf («\ n»); в конце, который (по мне) не должен влиять на код из-за предыдущих строк.

+0

Там нет никакой разницы в вывод, если вы сравниваете в Ideone: [sample1] (http://ideone.com/YRHEgp), [sample2] (http://ideone.com/exlshK). Это поведение конкретной реализации терминала/оболочки. –

+0

ОК, но я хотел бы знать, как он отличается в оболочке от ideone. – aroonav

ответ

5

Когда ваша программа заканчивается, оболочка записывает приглашение, начиная с любой позиции, в которой находился последний курсор. Итак, в первом случае, после \rha, курсор сидит на i. Оболочка перезапишет i любым первым символом вашего приглашения.

Во втором случае вы выводите в конец \n, который перемещает курсор на следующую строку, где оболочка записывает приглашение.

+0

У меня есть причина для первого выхода, но во втором выходе после printf («\ rha») «hai» будет присутствовать, а курсор будет в конце второго символа, готового написать третий символ ... тогда printf ("\ n") будет выполняться .... так что должен быть удален третий символ 'i', и курсор переместится на следующую строку (выдав вывод «ha») или символ «i» останется нетронутым, а курсор перейдите к следующей строке ((давая выход «hai»))? видя выход, я думаю, его первый. – aroonav

+0

@sparx: Да, '\ n' переходит к следующей строке, не меняя ничего в текущей строке. Поэтому, если курсор сидит на 'i', когда вы выводите' \ n', 'i' остается на месте. –

0

Если вы скомпилируете первый код, вместо i есть курсор, чтобы вы не могли видеть, что i. Во втором коде курсор находится в новой строке и не охватывает какого-либо символа.

2

Прежде всего, вы должны понять пробельные символы:

  1. \ п :: Он перемещает курсор на следующую строку.
  2. \ b :: Он перемещает курсор на один символ слева от консоли. Просто пробегает один символ .
  3. \ r :: Возврат караванов. Он перемещает курсор в крайнее правое положение той же линии.

Результат печати: 1. Печатает «ab», курсор сидит в конце строки. 2. Распечатывает «asi» после перемещения курсора назад на одно место (\ b), курсор находится в конце строки. 3. Печатает «hai», курсор сидит за га, чуть ниже i.

Итак, ВЫВОД :: хаи

В первом случае вы не в состоянии видеть «я» из-за курсором, тогда как во втором из-за символа новой строки вы сможете увидеть его

Смежные вопросы