C字符串函数 printf ,sprintf ,scanf,fscanf详解

本文详细介绍了C语言中的sprintf函数,它与printf类似,只是将输出内容写入到字符串中而非直接输出。文章讨论了sprintf的使用方法,包括格式化数字字符串,指定宽度、对齐方式以及16进制打印。特别提到了在打印16进制内容时如何实现等宽格式,并指出在处理不同整型数据时需要注意的符号扩展问题。
摘要由CSDN通过智能技术生成

一、sprintf() 函数详解

由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。
sprintf是个变参函数,定义如下:

int sprintf( char *buffer, const char *format [, argument]);

除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:格式化字符串上。

printf 和 sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要 的字符串。

1、格式化数字字符串

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进制表示。

我用来写xml文件,保存数据的例子:

char * Strdata[19][2] ={
   
	{
   "<cfgnum>"			,"</cfgnum>"},
	{
   "<devicetype>"		,"</devicetype>"},
	{
   "<deviceid>"		,"</deviceid>"},
	{
   "<hsolution>"		,"</hsolution>"},
	{
   "<vsolution>"		,"</vsolution>"},
	{
   
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值