printf%n如何计算字符数?

时间:2015-07-03 14:07:05

标签: c printf format-specifiers

#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什么都不打印。

3 个答案:

答案 0 :(得分:3)

请计算打印字符的数量,它们是14。

存储在int指针的变量"%n"指针中的值是"%n"说明符出现之前打印的字符数,有10表示poitner地址,4表示blah

blah0xffa9b6fc /* these are exactly 14 characters
  ^      ^
  %s     %p
*/

答案 1 :(得分:3)

仅支持Mr. Iharobhis answer所说的内容,

引自C11,章节§7.21.6.1,fprintf()(强调我的)

  

n

     

参数应该是一个指向有符号整数的指针,其中写有   到目前为止,通过此调用来写入输出流的字符数   fprintf中。没有参数被转换,但是消耗了一个参数。如果转换   规范包括任何标志,字段宽度或精度,行为是   未定义。

因此,计算格式字符串中的字节数,而不是实际打印字节数。

尽管如此,main()的推荐签名是int main(void)

答案 2 :(得分:0)

此输出字符串(在遇到格式说明符%n之前)

blah0xffa9b6fc

恰好包含14个符号。 val包含14的原因是格式说明符%p以十六进制表示法输出地址

0xffa9b6fc

确实在您的平台中,指针的大小为4个字节。:)