sprintf函数用法解析

1. sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf
在大多数场合可以替代itoa。
 
这样,一个整数的16 进制字符串就很容易得到,但我们在打印16 进制内容
时,通常想要一种左边补0 的等宽格式,那该怎么做呢?很简单,在表示宽
度的数字前面加个0 就可以了。

sprintf(s, "%08X", 4567); //产生:"000011D7"

上面以”%d”进行的10 进制打印同样也可以使用这种左边补0 的方式。

这里要注意一个符号扩展的问题:比如,假如我们想打印短整数(short)-1
的内存16 进制表示形式,在Win32 平台上,一个short 型占2 个字节,所
以我们自然希望用4 个16 进制数字来打印它:

short si = -1;

sprintf(s, "%04X", si);

产生“FFFFFFFF”,怎么回事?因为spritnf 是个变参函数,除了前面两个
参数之外,后面的参数都不是类型安全的,函数更没有办法仅仅通过一个
“%X”就能得知当初函数调用前参数压栈时被压进来的到底是个4 字节的整
数还是个2 字节的短整数,所以采取了统一4 字节的处理方式,导致参数压
栈时做了符号扩展,扩展成了32 位的整数-1,打印时4 个位置不够了,就
把32 位整数-1 的8 位16 进制都打印出来了。如果你想看si 的本来面目,
那么就应该让编译器做0 扩展而不是符号扩展(扩展时二进制左边补0 而不
是补符号位):

sprintf(s, "%04X", (unsigned short)si);

就可以了。或者:

unsigned short si = -1;
sprintf(s, "%04X", si);


2. 浮点数的打印和格式控制是sprintf 的又一大常用功能,浮点数使用格式符”
%f”控制,默认保留小数点后6 位数字,比如:

sprintf(s, "%f", 3.1415926); //产生"3.141593"

但有时我们希望自己控制打印的宽度和小数位数,这时就应该使用:”
%m.nf”格式,其中m 表示打印的宽度,n 表示小数点后的位数。比如:

sprintf(s, "%10.3f", 3.1415626); //产生:" 3.142"

sprintf(s, "%-10.3f", 3.1415626); //产生:"3.142 "

sprintf(s, "%.3f", 3.1415626); //不指定总宽度,产生:
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值