下面的代码演示了 width 的用法:
#include
int main(){
int n = 234;
float f = 9.8;
char c = '@';
char *str = "http:/";
printf("%10d%12f%4c%8s", n, f, c, str);
return 0;
}
运行结果:
234 9.800000 @http://
对输出结果的说明:
n 的指定输出宽度为 10,234 的宽度为 3,所以前边要补上 7 个空格。
f 的指定输出宽度为 12,9.800000 的宽度为 8,所以前边要补上 4 个空格。
str 的指定输出宽度为 8,"" 的宽度为 22,超过了 8,所以指定输出宽度不再起作用,而是按照 str 的实际宽度输出。
3) .precision 表示输出精度,也就是小数的位数。
当小数部分的位数大于 precision 时,会按照四舍五入的原则丢掉多余的数字;
当小数部分的位数小于 precision 时,会在后面补 0。
另外,.precision 也可以用于整数和字符串,但是功能却是相反的:
用于整数时,.precision 表示最小输出宽度。与 width 不同的是,整数的宽度不足时会在左边补 0,而不是补空格。
用于字符串时,.precision 表示最大输出宽度,或者说截取字符串。当字符串的长度大于 precision 时,会截掉多余的字符;当字符串的长度小于 precision 时,.precision 就不再起作用。
请看下面的例子:
#include
int main(){
int n = 123456;
double f = 882.923672;
char *str = "abcdefghi";
printf("n: %.9d %.4d\n", n, n);
printf("f: %.2lf %.4lf %.10lf\n", f, f, f);
printf("str: %.5s %.15s\n", str, str);
return 0;
}
运行结果:
n: 000123456 123456
f: 882.92 882.9237 882.9236720000
str: abcde abcdefghi
对输出结果的说明:
对于 n,.precision 表示最小输出宽度。n 本身的宽度为 6,当 precision 为 9 时,大于 6,要在 n 的前面补 3 个 0;当 precision 为 4 时,小于 6,不再起作用。
对于 f,.precision 表示输出精度。f 的小数部分有 6 位数字,当 precision 为 2 或者 4 时,都小于 6,要按照四舍五入的原则截断小数;当 precision 为 10 时,大于 6,要在小数的后面补四个 0。
对于 str,.precision 表示最大输出宽度。str 本身的宽度为 9,当 precision 为 5 时,小于 9,要截取 str 的前 5 个字符;当 precision 为 15 时,大于 9,不再起作用。
请看下面的例子:
#include
int main(){
int m = 192, n = -943;
float f = 84.342;
printf("m=%10d, m=%-10d\n", m, m); //演示 - 的用法
printf("m=%+d, n=%+d\n", m, n); //演示 + 的用法
printf("m=% d, n=% d\n", m, n); //演示空格的用法
printf("f=%.0f, f=%#.0f\n", f, f); //演示#的用法
return 0;
}
运行结果:
m= 192, m=192
m=+192, n=-943
m= 192, n=-943
f=84, f=84.
对输出结果的说明:
当以%10d输出 m 时,是右对齐,所以在 192 前面补七个空格;当以%-10d输出 m 时,是左对齐,所以在 192 后面补七个空格。
