как printf %n считает символы?

#include <stdio.h>

int main()
{
  int val;

  printf("blah%p%nblah", &val, &val);

  printf("val = %d\n", val);

  return 0;

}

Эта демонстрационная программа компилируется на 32-битной машине. Я думаю, что val должно быть 8. Но я получил это:

$ ./a.out
blah0xffa9b6fcblahval = 14

Почему 14? blah - 4 символа. Указатель в IA32 должен быть 4 байта. %n ничего не печатает.


person JACK M    schedule 03.07.2015    source источник
comment
Закрытие этого как дубликата, поскольку код, кажется, взят из этого ответа, который, в свою очередь, уже отвечает на этот вопрос.   -  person Lundin    schedule 03.07.2015


Ответы (3)


Пожалуйста, посчитайте количество напечатанных символов, их 14.

Значение, хранящееся в указателе переменной int спецификатора "%n", представляет собой количество символов, напечатанных до появления спецификатора "%n", 10 для адреса указателя и 4 для blah.

blah0xffa9b6fc /* these are exactly 14 characters
  ^      ^
  %s     %p
*/
person Iharob Al Asimi    schedule 03.07.2015

Просто для поддержки того, что Mr. Ихароб сказал в своем ответе,

Цитата из C11, глава §7.21.6.1, fprintf(), (выделено мной)

n

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

Таким образом, он не подсчитывает байты в строке формата, а скорее фактические напечатанные байты.

При этом рекомендуемая подпись main()int main(void).

person Sourav Ghosh    schedule 03.07.2015

Эта выходная строка (до того, как будет встречен спецификатор формата %n)

blah0xffa9b6fc

содержит ровно 14 символов. Причина, по которой val содержит 14, заключается в том, что спецификатор формата %p выводит адреса в шестнадцатеричной системе счисления.

0xffa9b6fc

И действительно в вашей платформе указатели имеют размер 4 байта. :)

person Vlad from Moscow    schedule 03.07.2015