C printf()和scanf()的*修饰符
关于printf()
和scanf()
有个神奇的*
修饰符,他和通配其实没什么关系,而且printf
和scanf
的作用不一样,所以一个个来看吧。
#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
中每一个分割都有空格,因此输入时也必须有空格,如果是其他符号,类似。
植入部分
如果您觉得文章不错,可以通过赞助支持我。
如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。