首页 > 编程知识 正文

sprintf函数原型,使用sprintf函数注意什么

时间:2023-05-06 20:00:51 阅读:138308 作者:2056

短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”

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。