2016-06-08 4 views
0

я прохожу тетрадкой на C и наткнулся на заявлениеСимволы и строки в Printf

printf("%c", "\n"); 

Что при запуске в консоли все еще работает, но отображается символ «$».

Почему это утверждение не врезаться консоль как

printf("%s", '\n'); 

делает?

+3

Это [неопределенное поведение] (http://stackoverflow.com/a/4105123/1505939), все может случиться –

+1

Неопределенное поведение не обязательно всегда вызывает сбои. Иногда вы получаете случайный вывод. Иногда случаются другие неопределенные вещи. –

ответ

0

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

2

Потому что %s ожидает NUL конец строки, где %c только хочет получить символ. Строка будет считываться за конец вашего буфера (единственный символ), который ищет NUL и, скорее всего, вызывает исключение памяти. Или нет - следовательно, неопределенное поведение.

+0

Первый пример пытается интерпретировать указатель как 'char'. Второй пытается обработать «int» как указатель ... но проблема не в недостающем нуле, это разыменование недопустимого указателя и попытка распечатать то, на что он указывает. – Dmitri

0

% s печатает до тех пор, пока не достигнет '\ 0', потому что \ n не имеет выхода, он будет считываться в память. «% С» необходимо только полукокса

+0

в этом случае, когда он начинает считывание, вероятно, более токсичен (как в случае возникновения исключения), чем то, что он будет читать, без исключения.В более простых моделях памяти (например, 16-разрядная DOS), скорее всего,% s 'printf' просто сбрасывает мусор на основе содержимого памяти, начиная с адреса 0x000a – infixed

3

строку в двойных кавычках, как, которая производит значение указателя на char (ака char*), в то время как апостроф производят значение, это символ (используя значение ASCII из Что в котировки. на некоторых компиляторах вы можете сложить несколько символов в одинарные кавычки.

printf("%c", *("\n")); 

бы напечатать новую строку, как * оператор будет разыменования указателя

(вы могли бы сделать *"\n", я просто как правило, быть консервативным в письменной форме expre ssions)

printf("%s", '\n'); 

падает, потому что %s ожидает указатель, и перевод строки отливают в указатель указывает от в сорняках и, скорее всего, вызывает недопустимый доступ к памяти

3

Это будет вызывать неопределенное поведение пропусканием данные имеют неправильный тип. Это просто произошло не сбой.

В некоторой реализации указатель, преобразованный из строкового литерала, передается в качестве аргумента. В отличие от %s, который будет интерпретировать аргумент как указатель и перейти к чтению, %c просто примет аргумент как число и распечатает его, поэтому у него меньше шансов сбой.

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