短si=-1;
sprintf(s,' x ',si );
“FFFFFFFF”发生是怎么回事? 因为spritnf是自变量函数,所以除了前面两个
除了参数之外,后面的参数是类型不安全的,不能只有一个函数通过
“%X”可以知道在最初调用函数前的参数被堆栈时按入的是否是4字节整数
因为还是2字节的短整数,所以采取统一4字节的处理方式,产生了参数压力
堆栈时进行了符号扩展,扩展为32位的整数-1。 如果打印时四个位置不够了
打印了32位整数-1的8位16进制。 如果你想看到si的真面目
那么,应该让编译器进行0扩展而不是符号扩展。 (扩展时在二进制文件的左边添加0
是辅助符号位) :
sprintf(s,' x ',) unsigned short ) si;
不用了。 或:
无符号短脉冲si=-1;
sprintf(s,' x ',si );
2 .浮点数的打印和格式控制是sprintf的另一个常用功能,浮点数使用格式符号"
%f )控件,默认保留六位小数数字,例如:
sprintf(s,' %f ',3.1415926; //「3.141593”诞生
但是,有时您可能希望自己控制打印宽度和小数位数。 在这种情况下,请按如下方式使用: ”
%m.nf”格式。 其中m表示打印宽度,n表示小数点后的位数。 例如:
sprintf(s,'.3f ',3.1415626 ); //发生:“3.142”
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的四个字
子句被随意解释为浮点数的格式,弄得很混乱。
3 .连接字符串
既然可以在sprintf的格式控制字符串中插入各种各样的东西,最终将它们连接在一起。
字符串”可以自然地连接字符串,在很多情况下可以代替strcat
sprintf可以一次连接多个字符串(当然也可以在它们之间同时插入其他字符串)
容,总之很灵活)。 例如:
char* who='I ';
char* whom='CSDN ';
sprintf(s,' %s love %s.',who,whom ); //发生: ' I love CSDN.'
strcat只能连接字符串。 称为以“ 0”结尾的字符数组或字符缓冲区。
空字符串),
但我们有两个文字缓冲区。 他们没有以“ 0”结束。 例如从第三个开始
多维数据集函数返回的字符数组、从硬件或网络传输中读取的字符流、它们
并非所有字符串后都有对应的“ 0”结尾。 如果直接连接的话,就没关系了
是sprintf还是strcat一定会导致非法的内存操作,strncat至少也是第一个被要求的
一个参数是空字符串。 我该怎么办? 我们自然会想起名字
对于页面介绍打印整数和浮点数,可以指定宽度。 字符串也一样。 例如:
char a1 [ ]={“”“a”、“”“b”、“”“c”、“d”、“d”、“d”、“d”、“d”
char a2 [ ]={“”“h”“、“”“I”“、“”“j”“、“”“k”“、“”“l”“、“”“”
如果:
sprintf(s,' %s%s )、a1和a2 ); //Don''''t do that!
十有八九会发生问题。 可以更改为:
sprintf(s,' %7s%7s ),a1,a2 );
我哪儿也没去。 正确的是:
sprintf(s,' %.7s%.7s ',a1,a2 ); //发生:“ABCDEFGHIJKLMN”
这可以模拟打印浮点数“%m.nf”,在“%m.ns”中,m表示占用宽度(
符号串长度不足时填补空格,超过时按实际宽度打印),n对应
字符串中允许的最大字符数。 通常,打印字符串时,m没什么用。 果然是点编号
后面的n被使用了很多。 当然,前后都可以只取一部分文字。
sprintf(s,' %.6s%.5s ',a1,a2 ); //发生:“ABCDEFHIJKL”
由于sprintf函数将输出写入字符串s并以“”“ ”“”结尾,因此生成的s
中有“”“ ”“”,因此可以使用printf(s ),而不用担心出现错误。)
在许多情况下,这些格式控件中用于指定长度信息的数字是
它不是静态指定的,而是动态指定的。 因为在很多情况下,程序在运行时直到最后都是明确的
需要取字符数组中的几个字符。 sprintf提供了此动态宽度/精度设置功能
的实现也考虑到了,sprintf采用“*”来占用本来需要的指定
宽度和精度常数数字的位置也同样,实际的宽度和精度可以与其他的相同
像的变量一样提供。 因此,上面的例子如下。
sprintf(s,' %.*s%.*s ',7,a1,7,a2 );
或:
sprintf(s,' %.*s ).*s ),sizeof ) a1,a1,sizeof ) a2 ),a2 );
实际上,上述打印字符、整数、浮点数等可以动态指定它们的常数值。
例如:
sprintf(s,' %-*d ',4,' ' ' a ' ' );//发生“65”
sprintf(s,' %#0*X ',8,128 );//发生“0x 000080”,“#”发生0x
sprintf(s,' %*.*f ',10,2,3.1415926;//发生“3.14”