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

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

#include <stdio.h>

int main(void)
{
    unsigned width, precision;
    int number = 256;
    double weight = 242.5;

    printf("What field width?\n");
    scanf("%d", &width);
    printf("The number is: %*d: \n", width, number);
    printf("Now enter a width and a precision: \n");
    scanf("%d %d", &width, &precision);
    printf("Weight = %*.*f\n", width, precision, weight);
    return 0;
}

可以看出

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

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

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

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

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

#include <stdio.h>

int main(void)
{
    int n;

    printf("Please enter three integers: \n");
    scanf("%*d %*d %d",&n);
    printf("The last integer was %d\n", n);
    return 0;
}

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

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

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

结果:

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

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

植入部分

如果您觉得文章不错,可以通过赞助支持我。

如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。

标签: 源码, 知识, 代码段, 语法

添加新评论