printf和sprintf的格式控制

时间:2022-09-14 02:23:19

一.printf函数

函数原型:

int printf(const char *format,[argument]);

format 参数输出的格式,定义格式为:

  %[flags][width][.perc] [F|N|h|l]type

返回打印字符的个数。

例如printf("%d",printf("%d\t",32));则输出32 3.原因是里面的printf打印32(\t的输出),返回值是打印字符的个数,打印出来的是32 ,共3个字符(带转义的字符),因此输出外面的printf输出3.

1.type常用的格式。 

%d---有符号的十进制数,

%u---无符号的十进制数 ,

%o---无符号的八进制数,

%x---有符号的十六进制数,输出abcdef时是小写。

%X---有符号的十六进制,输出abcdef时是大写。

%f---double型的。默认的是输出到小数点后六位,整数部分全部输出,四舍五入取值。

%e---double的标准的指数形式输出,形式如ae+c 即a是1-10之间的数,保留6位小数,c是整数。e是代表指数10.

%E---和%e类似,输出时的e是大写的E。%e和%E是针对double的,参数是整数是结果不正确,需要强制转换。

%c---输出一个字符。

%s---输出一个字符串,直到遇到字符串结束符'\0'。

%%---输出一个百分号%。

2.对齐和输出位数控制

2.1 flags 规定输出格式,取值和含义如下:

取值      含义
默认值,右对齐输出   
-(减号) 左对齐,右边填充空格
+(加号)  在数字前增加符号 +/- ,一般输出负数时是会有符号输出的,输出非负数时是不会输出正号+。
     当在前面加+号时输出非负数(包括0)时就会带有符号。

type=c,s,d,i,u时没有影响

type=o,x,X时,分别在数值前增加'0',"0x","0X", 

type=e,E,f时,总是使用小数点

type=g,G时,除了数值为0外总是显示小数点  

   例如 : int  a = 10; printf("a=%+d",a); 就会输出a=+10;即会把符号位输出。

  例如 :printf("%x,%#x",16,16);则输出10,0x10 

   2.2.width 用于控制显示数值的宽度,取值和含义如下

取值 含义
 n(n=1,2,3...) 宽度至少为n位,不够以空格填充,足够则正常输出
0n(n=1,2,3...)  宽度至少为n位,不够左边以0填充
*  式列表中,下一个参数还是width,width由外界提供
无                              默认值,不对宽度控制                                                                          

例如printf("%*s",5,"abc");则输出##abc,#代表空格,应为width是*,传的数字是5(也可以是赋了值的变量);等价为printf("%5s","abc");宽度至少为5,不足则加了空格。

   2.3. .prec 用于控制小数点后面的位数,取值和含义如下

可以取值有(0,n(正整数),*三种)

取值  含义                                                                                     
.0

 当type=d,i,o,u,x时,没有影响 

  type=e,E,f时,不显示小数点

.n

n(n=1,2,3...) 当type=e,E,f时表示的最大小数位数

    type=其他,表示显示的最大宽度

.* 格式列表中,下一个参数还是prec,即由传的参数控制
无      默认值,不控制,按缺省精度控制                                                    
  printf("%*.*s",2,3,"abcd");有*号代表格式由外界传的参数控制,等价于: printf("%2.3s",2,3,"abcd");表示宽度至少为2,参数是s,则3表示s的最大宽度,因此输出abc。

2.4.F|N|h|l 表示指针是否是远指针或整数是否是长整数

  F 远指针

  n 近指针

  h 短整数或单精度浮点数

  l 长整数或双精度浮点数

最长用的可能就是l了,即long int a; printf("%ld ",a);用来输出一个长整型数。

二:sprintf函数

字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。 

函数原型:int sprintf( char *buffer, const char *format, [ argument] … );

相对于printf来说,多了一个char*的参数,后面的参数和printf的参数意义相同。返回值是写入字符的个数。

和printf不同的是sprintf输出到到buffer中,printf是输出到控制台上。 

 此函数可以用来把整数转为字符串。

这个函数用起来不太安全,没有对buffer限制,可能会有溢出,一些带有buffer限制的函数原型如下:

int sprintf_s(char *buffer,size_t sizeOfBuffer,const char *format, [argument] ... );



参考文章链接:http://blog.csdn.net/TrueLie/article/details/1692942

http://blog.sina.com.cn/s/blog_48964cb10100lg1v.html