printf函数原理和格式化字符串

1、printf函数原理

如果遇到普通字符,直接输出。
如果遇到格式说明符(如 %d、%f 等),则根据说明符的类型从参数列表(va_list)中取出对应的值,并按照指定的格式进行转换,这一句话其实描述的是va_arg(ap, t)这个函数的功能。 然后再输出转换后的字符串。
而ap就是参数列表,它的结构体在arch64架构是这样定义的

    typedef struct __va_list {
      void *__stack; // 指向堆栈上的参数区域
      void *__gr_top;  // 通用寄存器区域的顶部指针
      void *__vr_top;  // 浮点寄存器区域的顶部指针
      int __gr_offs;  // 通用寄存器的偏移量
      int __vr_offs;  // 浮点寄存器的偏移量
    } va_list;

整数参数可能存储在通用寄存器中,浮点参数存储在浮点数寄存器中,多余的参数存储在堆栈上。

2、格式字符串

格式字符串可以包含普通字符和格式说明符(以 % 开头)。
常见格式说明符

  • %d 或 %i:十进制整数。
  • %u:无符号十进制整数。
  • %f:浮点数(默认显示 6 位小数)。
  • %lf:双精度浮点数(与 %f 等效)。
  • %c:单个字符。
  • %s:字符串。
  • %x 或 %X:十六进制整数(小写或大写)。
  • %o:八进制整数。
  • %%:输出一个 % 符号。

格式修饰符
格式说明符还可以带有修饰符,用于控制输出的宽度、精度等:

  • 宽度修饰符:%5d(表示输出宽度为 5 个字符,不足部分用空格填充)。
  • 精度修饰符:%.2f(表示浮点数保留 2 位小数)。
  • 对齐方式:%-5d(左对齐)。
  • 填充字符:%05d(用 0 填充)。

3、参考

https://mp.weixin.qq.com/s/LRK9Byd7UqVqctB9rY1rjw
https://mp.weixin.qq.com/s/_4MvlMQOcSEBzI-5SN-CTg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值