Неожиданный результат от printf - PullRequest
4 голосов
/ 12 марта 2010
#include<stdio.h>
int main()
{
    printf("He %c llo",65);
}

Выход: He A llo

#include<stdio.h>
int main()
{
    printf("He %c llo",13);
}

Выход: llo. Он не печатает He.

Я могу понять, что 65 является значением ASCII для A, и, следовательно, A печатается в первом случае, но почему llo во втором случае.

Спасибо

Ответы [ 3 ]

10 голосов
/ 12 марта 2010

ASCII 13 - возврат каретки, который в некоторых системах просто перемещает курсор в начало строки, на которой вы только что были.

Следующие символы затем стирают предыдущий текст.

5 голосов
/ 12 марта 2010

Man ascii:

Oct   Dec   Hex   Char
015   13    0D    CR  '\r'

Символ 13 означает возврат каретки, поэтому он печатает He, затем возвращается в начало строки и печатает напоминание llo.

3 голосов
/ 12 марта 2010

Это просто странно из-за характера возврата каретки *. Вы можете увидеть символы, которые выводятся, по трубопроводу к другому инструменту, например xxd:

$ gcc b.c && ./a.out | xxd
0000000: 4865 200d 206c 6c6f                      He . llo
$ gcc c.c && ./a.out | xxd
0000000: 4865 2041 206c 6c6f                      He A llo

* См. Википедия :

На принтерах, телетайпах и компьютерных терминалах, которые не были способны отображать графику, возврат каретки использовался без перехода на следующую строку, чтобы символы могли быть помещены поверх существующих символов для создания графики символов, подчеркивания и пересечения текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...