在刷题的时候碰到的代码填空看到输出格式中的这段代码:printf("%*s%s%*s\n",__________);
需要输出的格式为:________123456________
//下划线为空格
当时觉得很奇怪因为没见过%*s这样的用法就很纠结,以为是输出一个字符串指针,但是要输出那么多空格这也不科学。
第一次进行尝试是这么写的:
1 | printf("%*s%s%*s\n"," ","132456"," "); |
也没报错,但是结果不对。(输出出现乱码)
最后灵机一动想起来字符串输出格式的这种方式:
1 | printf("%8s%s%8s"," ","132456"," "); |
输出格式很标准:(________123456________
)//下划线为空格
然后问题就是怎么才能使下面两行代码的输出格式一致呢?
1 | printf("%*s%s%*s\n"," ","132456"," "); |
经过翻书查询在《C Primer Plus
》第四版P81,4.4.6 printf()和scanf()的*修饰符
中写到:
printf()和scanf()都可以使用*修饰符来修饰说明符的意义,但他们方式不同。
printf的用法
假定您不想事先指定字符宽度,而是希望由程序来指定该值那么您可以使用*修饰符来达到目的。
代码示例:假定number=123.4
1 | scanf("%d%d",&width,&precision); |
TEST这段代码:
输入:8 3
输出:__123.400
//下划线为空格
%8.3f的意思是字段宽度(包括小数点)为8,其中小数点后部分占3位
那么同理,输出字符串的时候也使用*修饰符
就可以理解为:printf("%*s",10,"a");
输出:(
_________a
)//下划线为空格
输出一个字段为十个字符的宽度。
若代码是这样:printf("%*s",-10,"a");
输出:(
a_________
)//下划线为空格
可见*修饰符参数的正负类似于左右对齐的格式。
那么%*s的输出格式就应为:
printf(“%*s”,
字段总宽度
,”需要输出的字符串
“);
现在回看我们需要输出的格式:
代码:
printf("%*s%s%*s\n",__________);
需要输出的格式为:________123456________
//下划线为空格
可以看出我们需要在字符串123456前部输出8个空格宽度的字段,则可以知道第一个%*s的输出参数为8," "
然后输出字符串123456,后面同样是需要输出8个字符宽度的字段则参数和第一个%*s参数一致。
实现代码为:
1 | printf("%*s%s%*s",8," ","132456",8," "); |
输出:(________123456________
)