C/C++中占位修饰符*的用法

在刷题的时候碰到的代码填空看到输出格式中的这段代码:printf("%*s%s%*s\n",__________);
需要输出的格式为:________123456________//下划线为空格

当时觉得很奇怪因为没见过%*s这样的用法就很纠结,以为是输出一个字符串指针,但是要输出那么多空格这也不科学。
第一次进行尝试是这么写的:

1
printf("%*s%s%*s\n"," ","132456"," ");

也没报错,但是结果不对。(输出出现乱码)

最后灵机一动想起来字符串输出格式的这种方式:

1
printf("%8s%s%8s"," ","132456"," ");

输出格式很标准:(________123456________)//下划线为空格
然后问题就是怎么才能使下面两行代码的输出格式一致呢?

1
2
printf("%*s%s%*s\n"," ","132456"," ");
printf("%8s%s%8s"," ","132456"," ");

经过翻书查询在《C Primer Plus》第四版P81,4.4.6 printf()和scanf()的*修饰符中写到:

printf()和scanf()都可以使用*修饰符来修饰说明符的意义,但他们方式不同。

printf的用法

假定您不想事先指定字符宽度,而是希望由程序来指定该值那么您可以使用*修饰符来达到目的。

代码示例:假定number=123.4

1
2
scanf("%d%d",&width,&precision);
printf("%*.*f",width,precision,number);

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________)

全文完,若有不足之处请评论指正。
本文标题:C/C++中占位修饰符*的用法
文章作者:ZhaLiPeng
发布时间:2016年03月19日 11时49分
本文字数:本文一共有633字
原始链接:https://imzlp.me/posts/16506/
许可协议: CC BY-NC-SA 4.0
转载请保留原文链接及作者信息,谢谢!
您的捐赠将鼓励我继续创作!