sprintf(buffer,"%d %c %x",a,b,c);当整形数据占两个字节的时候,buffer至少要多大,才不会溢出?

关于这个问题差点纠结而亡。。。
废话不多说。
大家都知道sprintf是给第一个参数的指针指向的内存写入字符串。
此处问buffer至少要多大,我第一直觉就是6byte。(原谅我傻x一样的逻辑)
很白痴的以为当整形数据占2个byte的时候,%d 用2个byte   %c一个byte  
 %x2个byte加上空字符就没事了
天真,无邪呵呵
真相在此:(引用答案说明)
The first value can take up to six characters, the second at most one, and the third at most four.
Counting the two spaces and the terminatingNULbyte, the buffer must be at least 14 bytes long.


这个题目利用sprintf是写入字符串的特性,abc都是作为输入数据
然后a是个整形数据2个byte存储在内存中,数据范围是0~2^16-1,也就是说这是无符号的范围,最大达到65535,
如果是有符号的话就是-32768~32767,特别就特别在这个符号,他是一个字符!!这里的每个位上面的数都是一个
字符!!!先以二进制储存进内存,然后以十进制的形式解释这个数,最后以十进制的形式去将这个数储存为字符!!


这里%d是可以产生6个字符的,然后%c最多一个,


%x这里数据是以十六进制形式进行解释说明的,于是2个byte的整形数据存储的范围就是0000~ffff


最后还有两个空格和一个强制写入的空字符!


6+1+4+2+1 = 14!




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值