sprintf函数详细介绍

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

sprintf函数:sprintf函数详细介绍

疯狂代码 / ĵ:http://CDevelopment/Article13960.html

在将各种类型数据构造成串时sprf强大功能很少会让你失望由于sprf跟prf在使用方法上几乎样只是打印目地区别而已前者打印到串中后者则直接在命令行上输出这也导致sprf比prf有用得多

sprf是个变参定义如下:

sprf(char*buffer,constchar*format[,argument]...);

除了前两个参数类型固定外后面可以接任意多个参数而它精华显然就在第 2个参数:

格式化串上

prf和sprf都使用格式化串来指定串格式在格式串内部使用些以“%”开头格式介绍说明符(formatspecications)来占据个位置在后边变参列表中提供相应变量最终就会用相应位置变量来替代那个介绍说明符产生个者想要串

格式化数字串

sprf最常见应用的莫过于把整数打印到串中所以spritnf在大多数场合可以替代

itoa

如:

//把整数123打印成个串保存在s中

sprf(s,\"%d\",123);//产生\"123\"

可以指定宽度不足左边补空格:

sprf(s,\"%8d%8d\",123,4567);//产生:\"1234567\"

当然也可以左对齐:

sprf(s,\"%-8d%8d\",123,4567);//产生:\"1234567\"

也可以按照16进制打印:

sprf(s,\"%8x\",4567);//小写16进制宽度占8个位置右对齐

sprf(s,\"%-8X\",4568);//大写16进制宽度占8个位置左对齐

这样个整数16进制串就很容易得到但我们在打印16进制内容时通常想要种左边补0等宽格式那该如何做呢?很简单在表示宽度数字前面加个0就可以了

sprf(s,\"%08X\",4567);//产生:\"000011D7\"

上面以”%d”进行10进制打印同样也可以使用这种左边补0方式

这里要注意个符号扩展问题:比如假如我们想打印短整数()-1内存16进制表示形式在Win32平台上个型占2个字节所以我们自然希望用4个16进制数字来打印它:

si=-1;

sprf(s,\"%04X\",si);

产生“FFFFFFFF”如何回事?spritnf是个变参除了前面两个参数的外后面参数都不是类型安全更没有办法仅仅通过个“%X”就能得知当初前参数压栈时被压进来到底是个4字节整数还是个2字节短整数所以采取了统4字节处理方式导致参数压栈时做了符号扩展扩展成了32位整数-1打印时4个位置不够了就把32位整数-18位16进制都打印出来了

如果你想看si本来面目那么就应该让编译器做0扩展而不是符号扩展(扩展时 2进制左边补0而不是补符号位): sprf(s,\"%04X\",(unsigned)si);

就可以了或者:

unsignedsi=-1;

sprf(s,\"%04X\",si);

sprf和prf还可以按8进制打印整数串使用”%o”注意8进制和16进制都不会打 [Page]

印出负数都是无符号实际上也就是变量内部编码直接16进制或8进制表示

控制浮点数打印格式

浮点数打印和格式控制是sprf又大常用功能浮点数使用格式符”%f”控制默认保

留小数点后6位数字比如:

sprf(s,\"%f\",3.1415926);//产生\"3.141593\"

但有时我们希望自己控制打印宽度和小数位数这时就应该使用:”%m.nf”格式其中m表

示打印宽度n表示小数点后位数比如:

sprf(s,\"%10.3f\",3.1415626);//产生:\"3.142\"

sprf(s,\"%-10.3f\",3.1415626);//产生:\"3.142\"

sprf(s,\"%.3f\",3.1415626);//不指定总宽度产生:\"3.142\"

注意个问题你猜

i=100;

sprf(s,\"%.2f\",i);

会打出什么东东来?“100.00”?对吗?自己试试就知道了同时也试试下面这个:

sprf(s,\"%.2f\",(double)i);

第个打出来肯定不是正确结果原因跟前面提到样参数压栈时者并不知道跟i相对应格式控制符是个”%f”而执行时本身则并不知道当年被压入栈里是个整数于是可怜保存整数i那4个字节就被不由分说地强行作为浮点数格式来解释了整个乱套了不过如果有人有兴趣使用手工编码个浮点数那么倒可以使用这种思路方法来检验下你手工编排结果是否正确

/Ascii码对照

我们知道在C/C语言中char也是种普通scalable类型除了字长的外它和

long这些类型没有本质区别只不过被大家习惯用来表示和串而已(或许当年该把

这个类型叫做“”然后现在就可以根据实际情况使用或来把char通过typedef定义出来这样更合适些)于是使用”%d”或者”%x”打印个便能得出它10进制或16进制ASCII码;反过来使用”%c”打印个整数便可以看到它所对应ASCII以下段把所有可见ASCII码对照表打印到屏幕上(这里采用prf注意”#”和”%X”合用时自动为

16进制数增加”0X”前缀):

for(i=32;i<127;i){

prf(\"[%c]:%3d0x%#04X\\n\",i,i,i);

}

连接串

sprf格式控制串中既然可以插入各种东西并最终把它们“连成串”自然也就能够连

接串从而在许多场合可以替代strcat但sprf能够次连接多个串(自然也可以同时

在它们中间插入别内容总的非常灵活)比如:

char*who=\"I\";

char*whom=\"CSDN\";

sprf(s,\"%slove%s.\",who,whom);//产生:\"IloveCSDN.\"

strcat只能连接串(段以’’结尾或叫做缓冲null-terminated-)但有时我们有两段缓冲区他们并不是以’’结尾比如许多从第 3方库中返回从硬件或者网络传输中读进来流它们未必每段序列后面都有个相应’’来结尾如果直接连接不管是sprf还是strcat肯定会导致非法内存操作而strncat也至少要求第个参数是个null-terminated-那该如何办呢?我们自然会想起前面介绍打印整数和浮点数时可以指定宽度串也样比如: [Page]

chara1={’A’,’B’,’C’,’D’,’E’,’F’,’G’};

chara2={’H’,’I’,’J’,’K’,’L’,’M’,’N’};

如果:

相关文档
最新文档