printf()的*修饰符
如果你不想预先指定字段宽度,希望通过程序来指定,那么可以用***修饰符代替字段宽度。但还是要用一个参数告诉函数,字段宽度应该是什么。
也就是说,如果转换说明是%*d**,那么参数列表中应包含***和d对应的值。
这个技巧也可用于浮点值指定精度和字段宽度**。
#include <stdio.h>
int main(void) {
unsigned width, precision;
int number = 256;
double weight = 242.5;
scanf("%d", &width);
printf("#%*d#\n", width, number);
scanf("%d %d", &width, &precision);
printf("weight = #%*.*f#\n", width, precision, weight);
return 0;
}
变量width提供字段宽度,number是待打印的数字。因为转换说明*在d的前面,所以在printf()的参数列表中,width在number的前面。同样,width和precision提供打印weight的格式化信息。
下面是一个运行示例:
输入:
6
8 3
输出:
# 256#
weight = # 242.500#
这里,用户首先输入6,因此6是程序使用的字段宽度。类似地,接下来用户输入8和3,说明字段宽度是8,小数点后面显示3位数字。一般而言,程序应根据weight的值来决定这些变量的值。
scanf()的*修饰符
scanf()的*的用法与此不同。把*放在%和转换字符之间时,会使得scanf()跳过对应的输出项。
如下所示:
#include <stdio.h>
int main(void) {
int n;
scanf("%*d %*d %d", &n);
printf("%d", n);
return 0;
}
运行结果如下:
输入:
2 3 4
输出:
4
程序清单中的scanf()指示:跳过两个整数,把第3个整数拷贝给n。