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

87 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

printf()和scanf()都可以使用* 修改转换说明的含义。但用法不一样。

printf()的*用法

如果你想通过程序来指定字段宽度,可以用* 修饰符代替字段宽度。但需要用参数告诉函数,字宽是多少。也就是说,如果转换说明是%*d,那么参数列表中应该包含 *和d对应的值。这个方法也可以用于浮点值指定精度和字段宽度。下面举个例子来验证这个方法。

简单举例

#include <stdio.h>
int main(){
    unsigned width,precision;
    int number = 256;
    double weight = 242.5;
    printf("Enter a field width:\n",width,number);
    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);
    printf("Done!\n");
    return 0;
}

运行结果

变量width提供字段宽度,number是待打印的数字。因为转换说明中 * 在d的前面,所以在printf()的参数列表中,width在number的前面。同样的,width和precision提供打印weight个格式化信息。

Snipaste_2022-08-09_09-39-27.png

用户首先输入一个5,因此5是程序使用的字段宽度。类似的,接下来用户输入9和7,说明字段宽度是9,后面小数点后面显示7位数字。一般而言,程序应根据weight的值来决定这些变量值。但scanf()和它用途不一样。

scanf()的* 用法

把* 放在%和转换字符之间时,会使得scanf()跳过相应的输入项。下面举一个相关例子:

简单举例

#include <stdio.h>
int main(){
    int n;
    printf("Please enter three integers:\n");
    scanf("%*d %*d %d",&n);
    printf("The last integer was %d\n",n);
    return 0;
}

运行结果

scanf()指示:跳过两个整数,把第3个整数拷贝给n。

Snipaste_2022-08-09_09-53-27.png

如果我们需要读取特定列内容时,这个功能还是比较重要的。

总结

  • printf()的* 用来修饰符代替字段宽度。
  • scanf()的* 用来跳过相应的输入项内容。