CodeSky 代码之空

随手记录自己的学习过程

C printf()和scanf()的*修饰符

2014-03-02 17:47分类: C评论: 0

关于printf()scanf()有个神奇的*修饰符,他和通配其实没什么关系,而且printfscanf的作用不一样,所以一个个来看吧。

1#include <stdio.h>
2
3int main(void)
4{
5    unsigned width, precision;
6    int number = 256;
7    double weight = 242.5;
8
9    printf("What field width?\n");
10    scanf("%d", &width);
11    printf("The number is: %*d: \n", width, number);
12    printf("Now enter a width and a precision: \n");
13    scanf("%d %d", &width, &precision);
14    printf("Weight = %*.*f\n", width, precision, weight);
15    return 0;
16}
17

可以看出

1    printf("The number is: %*d: \n", width, number);
2

这里明明只有一个占位符却用了两个变量,实际上*也可以看做占位符,取代他的就是width的值,类似的可以看到

1    printf("Weight = %*.*f\n", width, precision, weight);
2

这样做的好处其实也很明显,可以自定义字符宽。

而在scanf()中,又很显然不是这样的:

1#include <stdio.h>
2
3int main(void)
4{
5    int n;
6
7    printf("Please enter three integers: \n");
8    scanf("%*d %*d %d",&n);
9    printf("The last integer was %d\n", n);
10    return 0;
11}
12

这里又有一个会让人感到奇特的地方:

1    scanf("%*d %*d %d",&n);
2

三个占位符却只有一个变量,事实上,*scanf()起到了忽略的作用,所以给n赋值的其实是最后输入的数

结果:

Please enter three integers:
2004 2005 2006
The last integer was 2006

这里还有一点 在%*d %*d %d中每一个分割都有空格,因此输入时也必须有空格,如果是其他符号,类似。

评论 (0)