拓展知识5-2 动态设置输出域宽
域宽是指所占的字符数,在printf函数中可使用%md来规定对应输出项的输出域宽,其中的m是一个整数用来规定输出项的域宽。利用这种方法规定的域宽是固定的,不能随问题的变化而变化,能否进行动态设置输出域宽呢?回答是肯定的,实际上,printf函数还提供了一个“*”修饰符,用来动态设置输出域宽。
1与格式字符d配合使用
格式:printf("%*d",m,a);
其中是对应*的输出项,m可以是有确定值的常量或变量或表达式。
作用:将输出项a按当前m的值规定的域宽输出。当输出项实际域宽超过规定的域宽时,按实际域宽输出,当实际域宽不足规定的域宽时,左端用空格补足。
2.与格式字符f配合使用
格式:printf("%*.*f",m,n,a);
其中mn是对应*的输出项,都可以是有确定值的常量或变量或表达式。
作用:将输出项a按当前m的值规定的域宽(含小数点及小数位数)、小数位数按n当前的值输出。当输出项实际域宽超过规定的域宽时,按实际域宽输出,当实际域宽不足规定的域宽时,左端用空格补足。
3.与格式字符s配合使用
格式:printf("%*.*s",m,n,a);
其中mn是对应*的输出项,都可以是有确定值的常量或变量或表达式。
作用:将输出项a中字符串按n个字符或实际长度(实际长度不足n个字符时)输出,总输出域宽为m。当nm时,按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小时内删除。