C语言中printf函数的格式化输出

int printf ( const char * format, … )

  • 将格式化的数据打印到标准输出

printf()函数将上述函数定义中format指向的C字符串写到标准输出。如果format中包含了格式说明符(以%开头的子序列),则format之后的附加参数将被格式化并插入到字符串中代替对应的说明符。

参数

1. format

  • 包含了要写入标准输出的文本的C字符串

它可以可选地包含一些格式说明符,这些说明符可以被附加参数替换并按要求格式化。 
格式说明符的形式如下: 
%[标志][宽度][.精度][长度]类型

1.1 类型

类型输出例子
d或i 带符号十进制整形 392
u 无符号十进制整形 7235
o 无符号八进制数 610
x 无符号十六进制整形 7fa
X 无符号十六进制整形(大写) 7FA
f 十进制浮点数,小写 392.65
F 十进制浮点数,大写 392.65
e 科学计数法(尾数/指数),小写 3.9265e+2
E 科学计数法(尾数/指数),大写 3.9265E+2
g 使用最短的表示: %e 或 %f 392.65
G 使用最短的表示: %E 或 %F 392.65
a 十六进制浮点数,小写 -0xc.90fep-2
A 十六进制浮点数,大写 -0XC.90FEP-2
c 字符 a
s 字符串 sample
p 指针地址 b8000000
n 不打印。相应的参数必须是指向带符号整形的指针,到目前为止写入的字符数将被存储在指向的位置。  
% 跟在一个%字符后面的另一个%将会写入一个% %


1.2 标志

标志描述
- 在给定字段宽度内左对齐; 右对齐是默认的(见宽度子说明符)。
+ 使结果带上正负符号(+或-)即使结果是正数;默认只有负数才会有正负符号。
(space) 如果没有写入正负符号,则插入一个空格。
# 与o,x或X说明符一起使用,会在0以外的数字前加上0,0x或0X的前缀;与a,A,e,E,f,F,g或G一起使用,即使没有小数,也会强制书写输出包含一个小数点。,默认情况下,如果没有小数,则不会写入小数点。
0 在填充时,用零(0)替代空格(见宽度子说明符)。


1.3 宽度

宽度描述
(数字) 要打印的最小字符数。如果要打印的值长度小于此数字,结果将填充空格;若值长度大于此数字,该值也不会被截断。
* 宽度在format字符串中未指定,但需要在附加参数中指定。


1.4 精度

精度描述
.数字 对于整数类型(d,i,o,u,x,X):精度指定要写入的最小位数:如果要写入的值比此数字短,结果将以前导零填充;即使结果较长,该值也不会被截断;精度为0表示对于值0,没有字符被写入。对于a,A,e,E,f和F类型:这是小数点后要打印的位数(默认为6)。对于g和G类型:这是要打印的有效数字的最大数量。对于s类型:这是要打印的最大字符数; 默认情况下将打印所有字符,直到遇到结尾的空字符为止。如果指定精度时没有一个明确的精度值,则假定为0。
.* 在format字符串中未指定精度,但需要在附加参数中指定。


1.5 长度

长度d iu o x Xf F e E g G a Acspn
(none) int unsigned int double int char* void* int*
hh signed char unsigned char         signed char*
h short int unsigned short int         short int*
l long int unsigned long int   wint_t wchar_t*   long int*
ll long long int unsigned long long int         long long int*
j intmax_t uintmax_t         intmax_t*
z size_t size_t         size_t*
t ptrdiff_t ptrdiff_t         ptrdiff_t*
L     long double        

注意对于c类型:它使用了一个int(或wint_t)作为参数,但是在将其格式化为输出之前,将其转换成为了char值(或wchar_t)。

Note:加粗并斜体的符号属于C99标准

2. 附加参数

根据format字符串,该函数可能会需要附加参数序列,每个参数包含一个值,用于替换format字符串中的格式说明符(或指向存储位置的指针)。这些参数应至少与格式说明符中指定的值一样多。 函数忽略其他参数。

返回值

若执行成功,返回写入的字符总数。 
如果发生写入错误,则设置错误指示器(ferror),并返回负数。 
如果写入宽字符时出现多字节字符编码错误,则将errno设置为EILSEQ,并返回负数。

例子

/* printf example */
#include <stdio.h>

int main()
{
   printf ("Characters: %c %c \n", 'a', 65);
   printf ("Decimals: %d %ld\n", 1977, 650000L);
   printf ("Preceding with blanks: %10d \n", 1977);
   printf ("Preceding with zeros: %010d \n", 1977);
   printf ("Some different radices: %d %x %o %#x %#o \n", 100, 100, 100, 100, 100);
   printf ("floats: %4.2f %+.0e %E \n", 3.1416, 3.1416, 3.1416);
   printf ("Width trick: %*d \n", 5, 10);
   printf ("%s \n", "A string");
   return 0;
}

输出:

Characters: a A 
Decimals: 1977 650000 
Preceding with blanks: 1977 
Preceding with zeros: 0000001977 
Some different radices: 100 64 144 0x64 0144 
floats: 3.14 +3e+000 3.141600E+000 
Width trick: 10 
A string

 

翻译内容来源:http://www.cplusplus.com/reference/cstdio/printf/

 

文章转载出处:https://blog.csdn.net/u012707739/article/details/77806780

作者:

posted @ 2018-10-25 10:10  天南星2018  阅读(851)  评论(0)    收藏  举报