<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[sprintf函数详细介绍]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Tue, 15 Jun 2010 04:33:40 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	在将各种类型的数据构造成字符串时，sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样，只是打印的目的地不同而已，前者打印到字符串中，后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。 <br/><br/>sprintf 是个变参函数，定义如下： <br/>int sprintf( char *buffer, const char *format [, argument] ... ); <br/>除了前两个参数类型固定外，后面可以接任意多个参数。而它的精华，显然就在第二个参数： <br/>格式化字符串上。 <br/><br/><br/>printf 和sprintf 都使用格式化字符串来指定串的格式，在格式串内部使用一些以“%”开头的格式说明符（format specifications）来占据一个位置，在后边的变参列表中提供相应的变量，最终函数就会用相应位置的变量来替代那个说明符，产生一个调用者想要 的字符串。 <br/><br/><br/>格式化数字字符串 <br/>sprintf 最常见的应用之一莫过于把整数打印到字符串中，所以，spritnf 在大多数场合可以替代 <br/>itoa。 <br/><br/>如： <br/>//把整数123 打印成一个字符串保存在s 中。 <br/>sprintf(s, &#92;&quot;%d&#92;&quot;, 123); //产生&#92;&quot;123&#92;&quot; <br/>可以指定宽度，不足的左边补空格： <br/>sprintf(s, &#92;&quot;崓&#92;&quot;, 123, 4567); //产生：&#92;&quot; 123 4567&#92;&quot; <br/>当然也可以左对齐： <br/>sprintf(s, &#92;&quot;%-8d峔&quot;, 123, 4567); //产生：&#92;&quot;123 4567&#92;&quot; <br/>也可以按照16 进制打印： <br/>sprintf(s, &#92;&quot;%8x&#92;&quot;, 4567); //小写16 进制，宽度占8 个位置，右对齐 <br/>sprintf(s, &#92;&quot;%-8X&#92;&quot;, 4568); //大写16 进制，宽度占8 个位置，左对齐 <br/><br/>这样，一个整数的16 进制字符串就很容易得到，但我们在打印16 进制内容时，通常想要一种左边补0 的等宽格式，那该怎么做呢？很简单，在表示宽度的数字前面加个0 就可以了。 <br/>sprintf(s, &#92;&quot;X&#92;&quot;, 4567); //产生：&#92;&quot;000011D7&#92;&quot; <br/>上面以”%d”进行的10 进制打印同样也可以使用这种左边补0 的方式。 <br/><br/><br/>这里要注意一个符号扩展的问题：比如，假如我们想打印短整数（short）-1 的内存16 进制表示形式，在Win32 平台上，一个short 型占2 个字节，所以我们自然希望用4 个16 进制数字来打印它： <br/>short si = -1; <br/>sprintf(s, &#92;&quot;X&#92;&quot;, si); <br/>产 生“FFFFFFFF”，怎么回事？因为spritnf 是个变参函数，除了前面两个参数之外，后面的参数都不是类型安全的，函数更没有办法仅仅通过一个“%X”就能得知当初函数调用前参数压栈时被压进来的到底 是个4 字节的整数还是个2 字节的短整数，所以采取了统一4 字节的处理方式，导致参数压栈时做了符号扩展，扩展成了32 位的整数-1，打印时4 个位置不够了，就把32 位整数-1 的8 位16 进制都打印出来了。 <br/><br/>如果你想看si 的本来面目，那么就应该让编译器做0 扩展而不是符号扩展（扩展时二进制左边补0 而不是补符号位）： <br/>sprintf(s, &#92;&quot;X&#92;&quot;, (unsigned short)si); <br/>就可以了。或者： <br/>unsigned short si = -1; <br/>sprintf(s, &#92;&quot;X&#92;&quot;, si); <br/><br/><br/>sprintf 和printf 还可以按8 进制打印整数字符串，使用”%o”。注意8 进制和16 进制都不会打 [Page]<br/>印出负数，都是无符号的，实际上也就是变量的内部编码的直接的16 进制或8 进制表示。 <br/><br/><br/>控制浮点数打印格式 <br/>浮点数的打印和格式控制是sprintf 的又一大常用功能，浮点数使用格式符”%f”控制，默认保 <br/>留小数点后6 位数字，比如： <br/>sprintf(s, &#92;&quot;%f&#92;&quot;, 3.1415926); //产生&#92;&quot;3.141593&#92;&quot; <br/>但有时我们希望自己控制打印的宽度和小数位数，这时就应该使用：”%m.nf”格式，其中m 表 <br/>示打印的宽度，n 表示小数点后的位数。比如： <br/>sprintf(s, &#92;&quot;.3f&#92;&quot;, 3.1415626); //产生：&#92;&quot; 3.142&#92;&quot; <br/>sprintf(s, &#92;&quot;%-10.3f&#92;&quot;, 3.1415626); //产生：&#92;&quot;3.142 &#92;&quot; <br/>sprintf(s, &#92;&quot;%.3f&#92;&quot;, 3.1415626); //不指定总宽度，产生：&#92;&quot;3.142&#92;&quot; <br/><br/><br/>注意一个问题，你猜 <br/>int i = 100; <br/>sprintf(s, &#92;&quot;%.2f&#92;&quot;, i); <br/>会打出什么东东来？“100.00”？对吗？自己试试就知道了，同时也试试下面这个： <br/>sprintf(s, &#92;&quot;%.2f&#92;&quot;, (double)i); <br/>第 一个打出来的肯定不是正确结果，原因跟前面提到的一样，参数压栈时调用者并不知道跟i相对应的格式控制符是个”%f”。而函数执行时函数本身则并不知道当 年被压入栈里的是个整数，于是可怜的保存整数i 的那4 个字节就被不由分说地强行作为浮点数格式来解释了，整个乱套了。不过，如果有人有兴趣使用手工编码一个浮点数，那么倒可以使用这种方法来检验一下你手工编 排的结果是否正确。 <br/><br/><br/>字符/Ascii 码对照 <br/>我们知道，在C/C 语言中，char 也是一种普通的scalable 类型，除了字长之外，它与short， <br/>int，long 这些类型没有本质区别，只不过被大家习惯用来表示字符和字符串而已。（或许当年该把 <br/>这 个类型叫做“byte”，然后现在就可以根据实际情况，使用byte 或short 来把char 通过typedef 定义出来，这样更合适些）于是，使用”%d”或者”%x”打印一个字符，便能得出它的10 进制或16 进制的ASCII 码；反过来，使用”%c”打印一个整数，便可以看到它所对应的ASCII 字符。以下程序段把所有可见字符的ASCII 码对照表打印到屏幕上（这里采用printf，注意”#”与”%X”合用时自动为16 进制数增加”0X”前缀）： <br/>for(int i = 32; i &lt; 127; i ) &#123; <br/>printf(&#92;&quot;[ %c ]: = 0x%#04X&#92;&#92;n&#92;&quot;, i, i, i); <br/><br/>摘抄：http://www.xker.com/page/e2009/0221/69483.html
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] sprintf函数详细介绍]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>