拓展知识5-2 动态设置输出域宽
域宽是指所占的字符数,在printf函数中可使用%md来规定对应输出项的输出域宽,其中的m是一个整数用来规定输出项的域宽。利用这种方法规定的域宽是固定的,不能随问题的变化而变化,能否进行动态设置输出域宽呢?回答是肯定的,实际上,printf函数还提供了一个“*”修饰符,用来动态设置输出域宽。
1.与格式字符d配合使用
格式:printf("%*d",m,a);
其中是对应*的输出项,m可以是有确定值的常量或变量或表达式。
作用:将输出项a按当前m的值规定的域宽输出。当输出项实际域宽超过规定的域宽时,按实际域宽输出,当实际域宽不足规定的域宽时,左端用空格补足。
2.与格式字符f配合使用
格式:printf("%*.*f",m,n,a);
其中m,n是对应*的输出项,都可以是有确定值的常量或变量或表达式。
作用:将输出项a按当前m的值规定的域宽(含小数点及小数位数)、小数位数按n当前的值输出。当输出项实际域宽超过规定的域宽时,按实际域宽输出,当实际域宽不足规定的域宽时,左端用空格补足。
3.与格式字符s配合使用
格式:printf("%*.*s",m,n,a);
其中m,n是对应*的输出项,都可以是有确定值的常量或变量或表达式。
作用:将输出项a中字符串按n个字符或实际长度(实际长度不足n个字符时)输出,总输出域宽为m。当n≥m时,按n指定的域宽或实际长度输出,当n<m时,不足部分左端用空格补足。
应用实例:【例5-7】输出指定图案
输出以下由星号组成的图案。
*
***
*****
*******
*****
***
*
【例5-7】的程序代码使用了循环嵌套,比较麻烦,效率也低。可以使用设置动态域宽来简化程序。已知
printf函数中用到格式符%5空格数y与行数x(x=0,1,2,3,4,5,6)的关系为:
星号数z与行数x(x=0,1,2,3,4,5,6)的关系为:
得到每行输出总的字符个数与行数x的关系为:
于是,程序代码可简化为:
#include "stdio.h"
#define N 6
void Pattern(void)
{
int x;
for(x=0;x<=N;x++)
{
if(x<=N/2)
printf("%*.*s\n",x+4,2*x+1,"*******");
else
printf("%*.*s\n",10-x,13-2*x,"*******");
}
}
int main()
{
Pattern();
return 0;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论