没有合适的资源?快使用搜索试试~ 我知道了~
首页格式化数字字符串详解(sprintf)
资源详情
资源评论
资源推荐

格式化数字字符串
sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf 在
大多数场合可以替代 itoa。如:
//把整数 123 打印成一个字符串保存在 s 中。
sprintf(s, "%d", 123); //产生"123"
可以指定宽度,不足的左边补空格:
sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"
当然也可以左对齐:
sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"
也可以按照 16 进制打印:
sprintf(s, "%8x", 4567); //小写 16 进制,宽度占 8 个位置,右对齐
sprintf(s, "%-8X", 4568); //大写 16 进制,宽度占 8 个位置,左对齐
这样,一个整数的 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);
sprintf 和 printf 还可以按 8 进制打印整数字符串,使用”%o”。注意 8 进
制和 16 进制都不会打印出负数,都是无符号的,实际上也就是变量的内部编
码的直接的 16 进制或 8 进制表示。
2. 控制浮点数打印格式
浮点数的打印和格式控制是 sprintf 的又一大常用功能,浮点数使用格式
符”%f”控制,默认保留小数点后 6 位数字,比如:
sprintf(s, "%f", 3.1415926); //产生"3.141593"
但有时我们希望自己控制打印的宽度和小数位数,这时就应该使
用:”%m.nf”格式,其中 m 表示打印的宽度,n 表示小数点后的位数。比如:

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论1