sprintf函数用法详解,sprintf与sprintf_s
sprintf(s, %-10.3f ,3.1415626);//生成:“3.142”
sprintf(s, %.3f ,3.1415626);//未指定总宽度,结果为:“3.142”
注意一个问题,你猜int i=100
sprintf(s, %.2f ,I);
会打什么?"100.00"?正确自己试试,也试试下面的:sprintf(s, %.2f ,(double)I);
第一种肯定不是正确的结果。原因和前面说的一样。参数堆叠时,调用者不知道I对应的格式控制器是一个“%f”。函数在执行的时候,函数本身并不知道当年推入堆栈的整数是整数,所以保存整数I的可怜的四个字节被强行解释为浮点数格式,弄得整个一塌糊涂。
但是,如果有人对手工编码浮点数感兴趣,你可以用这个方法来检查你手工排列的结果是否正确。J
字符/Ascii代码比较
我们知道,在C/C语言中,char也是一种普通的可伸缩类型。除了字长,它和short、int、long没有本质区别,只是用来表示字符和字符串。(也许当年应该把这种类型叫做“byte”,现在可以根据实际情况用byte或者short通过typedef定义char,这样更合适)
然后,通过打印一个带有“%d”或“%x”的字符,可以得到它的十进制或十六进制ASCII码;反过来用“%c”打印一个整数,可以看到其对应的ASCII字符。下面的程序段打印屏幕上所有可见字符的ASCII码对照表(这里用的是printf。注意,当“#”和“%X”一起使用时,前缀“0X”会自动添加到十六进制数中):for(int I=32;i 127i ) {
printf([ %c ]:=0x%#04Xn ,I,I,I);
}
3.连接字符串
既然各种东西都可以插入到sprintf的格式控制字符串中,最后可以“连成一串”,那么连接字符串自然是可以的,从而在很多场合取代strcat。但是sprintf可以一次连接多个字符串(自然也可以同时插入其他内容,总之非常灵活)。比如:char * who= I
char * whom= CSDN ;
sprintf(s, %s爱%s . ,谁,谁);//生成:‘我爱CSDN。’
Strcat只能连接字符串(以 结尾的字符数组或称为字符缓冲区,null-terminated-string),但有时我们有两个字符缓冲区,它们不以 结尾。例如,从第三方库函数返回的许多字符数组和从硬件或网络传输中读取的字符流可能并不总是在每个字符序列的末尾有相应的“