1、转换说明符及结果输出:
转换说明 | 输出 |
%a | 浮点数、十六进制数字和p-计数法 |
%A | 浮点数、十六进制数字和P-计数法 |
%c | 一个字符 |
%d | 有符号的十进制数 |
%e | 浮点数、e-计数法 |
%E | 浮点数、E-计数法 |
%f | 浮点数、十进制计数法 |
%g | 根据数值的不同自动选择%f或%e。 |
%G | 根据数值的不同自动选择%F或%E。 |
%i | 有符号的十进制数 |
%o | 无符号的八进制整数 |
%p | 指针 |
%s | 字符串 |
%u | 无符号的十进制整数 |
%x | 使用十六进制数字0f的无符号十六进制整数 |
%X | 使用十六进制数字0F的无符号十六进制整数 |
%% | 打印一个百分号 |
2、printf()格式:
printf(Comtrol-string,item1.item2,...);
item1,item2是要打印打项目,它们可以使变量,也可以是常量或者表达式。
Comtrol-string(控制字符串)是一个描述项目如何打印的字符串。
不要忘记给控制字符串后面的列表中的每个项目都是用一个转换说明,如果遗漏,将会得不到正确的输出。
3、printf()修饰符
修饰符 | 意义 | 示例 |
标志- | 项目左对齐 | %-20s |
标志+ | 根据值的正负会带上相应符号 | %+6.2f |
标志 (空格) | 值为正,则带前导空格;为负,则带减号符号 | % 6.2f |
标志# | %o则以0开始; %x则以0x;%X以0X开始; 浮点形式,保证即使不跟数字,也打印一个小数点; %g,%G格式,防止尾随0被删除 | %#o %#x %#8.0f %+#10.3E |
标志0 | 对于所有的数字格式,用前导0而不是用空格填充字段宽度 | %010d %08.3f |
digit(s) | 字段宽度的最小值。如果该字段大于该指定宽度,则会自动使用合适的宽度进行显示 | %4d |
.digit(s) | 精度。 %e、%E、%f -- 显示小数的位数。 %g、%G -- 有效数字的最大位数。 %s -- 打印字符的最大数目。 整数转换 -- 打印数字的最小位数。 | %5.2f表示打印一个浮点数,宽度为5,小数点后有两个数字。 |
h | 和整数转换说明符一起使用,表示一个short类型的值 | %hu、%hx、%6.4hd |
hh | 和整数转换说明符一起使用,表示一个char类型的值 | %hhd |
j | 和整数转换说明符一起使用,表示一个intmax_t类型的值 | %jd、%8jX |
l | 和整数转换说明符一起使用,表示一个long类型的值 | %ld、%8lu |
ll | 和整数转换说明符一起使用,表示一个long long类型的值 | %lld、%8llu |
L | 和浮点转换说明符一起使用,表示一个long double的值 | %Lf、%10.4Le |
t | 和整数转换说明符一起使用,表示一个ptrdiff_t值(与两个指针之间的差对应的类型) | %td、%12ti |
z | 和整数转换说明符一起使用,表示一个size_t值(sizeof返回的类型) | %zd、%12zx |
4、有用于打印浮点类型double和long double的转换说明符,但是没有用于float的说明符。因为胃在K&R C中float值在被使用之前,会被自动的转换为double类型。
5、参数传递
其显示结果将会是错误的。
导致其显示错误的原因是不匹配的转换。且发生在参数传递过程中。
printf()函数调用告诉计算机把变量n1-n4的值传递给计算机,计算机把他们放置在堆栈的一块内存区中来实现。n1在堆栈中是8个字节(float转换成double类型),同样,n2 占8个字节,n3和n4占用4个字节。然后控制转移到printf函数上。但是在读取内存的过程中,根据转换说明符去读取,%ld告诉他要读取4个字节,读完之后连续读内存,并显示出来,这样显示的四个值都是错误的。分别是n1的前半部、n1的后半部、n2的前半部、n2的后半部。所以虽然n3和n4的转换说明符虽然都正确,但是仍然读取了错误的数据。
6、printf()函数的返回值是打印的字符的数目,如果有输出错误,则返回一个负数。
7、如何打印较长的字符串
a、使用多个printf()语句,且只在最后一句上加入换行符。
b、使用反斜线符号(/)和回车键的组合来结束第一行,告诉编译器此行没完。不过下一行必须从最左边开始,否则会将你的任何空格都打印出来。
c、使用多个字符串进行连接。printf("I" " love" " C programming!");且需手动加入自己需要显示的空格符,两个字符串之间可以不加。