printf("%d + %c = %i\n", a, b, c)
fprintf与printf类似,fprintf是把数据写到任何文件中,第一个参数是任意文件指针。printf相当于是第一个参数默认为stdout的fprintf函数,如下所示:
printf(stuff);
fprintf(stdout,stuff);
fprintf简单示例:
fprintf(fp, "%d\n", i);//fp为文件指针
接下来是sprintf函数,第一个参数是一个指向字符数组的指针,sprintf把输出数据写到这个字符数组中。同时应该确保这个数组足够大,能容纳生成的输出数据,输出以空字符('\0')收尾。其余参数和printf相同。
返回值:
这三个函数都是已传送的字符数,sprintf输出的空字符不计入。
printf、fprintf写入时发生I/O错误,会返回一个负值。sprintf说是失败返回负值,网上没找到说怎么算失败的,还有待考证。
格式项:
%[flags][width][.precision][length]specifier
格式码specifier:
%d, %i 十进制有符号整数
%u 十进制无符号整数
%f、%e、%g 浮点数
%g 保留六位有效数字,去掉尾缀的零。打印那些不需要按列对齐的浮点数很有用。超过999999的数,会用科学计数法,且四舍五入,保留六位有效数字。(eg:打印123456789.0使用%g,得到1.23457e+08)比较小的数,指数小于等于才会用科学计数法。(eg:打印3.14159e-4 和 3.14159e-5,分别得到0.0003143159 和 3.14159e-5)
%e 一律使用指数形式,保留小数点后六位有效数字。(eg:3.141593 得到 3.141593e+00)
%f 与%e相反,不使用指数形式,保留小数点后六位有效数字。(eg:1e6 得到 1000000.000000)
%E、%G 与%e、%g相同,只不过用大写的E代替小写e。
%s 字符串
%c 单个字符
%p 指针的值
%x 无符号以小写字母十六进制表示的整数
%X 无符号以大写字母十六进制表示的整数
%o 无符号以八进制表示的整数
%% 打印字符'%'
%[flags][width][.precision][length]specifier
宽度修饰符width:(eg:%2d)
固定长度的区间内打印数值,数据长度不够左侧补空格字符,长度超过了会适当调整区间长度。
如:
for (int i = 8; i < 12; i++)
{
printf("|%2d| |%3d| |%4d|\n", i * 10, i * 100, i * 100);
}
打印出来为
|80| |800| | 800|
|90| |900| | 900|
|100| |1000| |1000|
|110| |1100| |1100|
%[flags][width][.precision][length]specifier
精度修饰符precision:(eg:%.2d)
指定打印数字位数,或者限制打印字符串中的字符数。
对整数格式%d、%o、%x、%u等,指定打印数字最少位数。如果数字少于这个位数,会在前面补上0。
如
printf("%.2d/%.2d", 7, 14);
将打印出
07/14
对于%e、%f等格式码,表示小数点后应该出现的数字位数。
对于%g格式码,指定打印的有效数字。
对于%s,表示打印的字符数。
对于%c和%%,被忽略。
%[flags][width][.precision][length]specifier
标志位flags:+,-,0, , #
‘-’:显示方式改为左对齐,右端填充空白字符。和宽度修饰符一起用。
‘+’:数字输出必须带正负号。
‘ ’:空格字符。若非负,前面插入空格字符(与负数前面的负号大小相等),如果想要左对齐可以保证正负数能对齐。
‘#’:对数值输出格式微调。
与 o、x 或 X 说明符一起使用时,非零值前面会分别显示 0、0x 或 0X。
与 e、E 和 f 一起使用时,会强制输出包含一个小数点,即使后边没有数字时也会显示小数点。默认情况下,如果后边没有数字时候,不会显示显示小数点。
与 g 或 G 一起使用时,结果与使用 e 或 E 时相同,但是尾部的零不会被移除。
‘0’:在指定填充 padding 的数字左边放置零(0),而不是空格。
%[flags][width][.precision][length]specifier
h 参数被解释为短整型或无符号短整型(仅适用于整数说明符:i、d、o、u、x 和 X)。
l 参数被解释为长整型或无符号长整型,适用于整数说明符(i、d、o、u、x 和 X)及说明符 c(表示一个宽字符)和 s(表示宽字符字符串)。
L 参数被解释为长双精度型(仅适用于浮点数说明符:e、E、f、g 和 G)。
可变宽度与精度:*
用*替换宽度修饰符或者精度修饰符,或者替换两者,可以间接指定宽度和精度。
如:
int l = 10;
int pri = 6;
float a = 3.0;
char name[] = "Hello";
printf("|%*.*s| |%.*f|\n", l, pri, name, l, a);
输出为:
| Hello| |3.0000000000|
参考:
1.《C陷阱与缺陷》