声明:这些内容主要是面向C语言的初学者,尤其是正在学习C语言的学生。
每个有用的C程序中都用到了printf函数,它可以根据我们指定的格式符来输出数据。很多初学者只关心%d,%f,%c等格式符,却忽略了格式修饰符的使用。事实上,合理地使用格式修饰符会给输出带来很多方便。本文只讨论一种格式修饰符,即输出域宽。下面的例子展示了指定输出域宽的好处。
教材第六章课后习题6.18要求按如下三种形式输出九九乘法表:
很明显,输出上述数据形式的时候,需要考虑对齐的问题。很多同学在对齐数据的时候,选择加空格的方式。可是由于数据位数不同,有1位数,也有两位数,所以需要额外的代码来判断并分别处理。下面是某位同学写的程序,输出的是第一种形式:
#include "stdio.h"
main()
{
int i,j,x;
printf(" 1 2 3 4 5 6 7 8 9\n");
printf(" - - - - - - - - -\n");
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
x=i*j;
printf(" %d ",x);
if(x<10)
printf(" ");
}
printf("\n");
}
}
程序中,前两个printf通过增加空格分别输出一行表头和一行分隔线。for循环中的第一个printf在格式符%d前后各加了一个空格,第二个printf为一位数再增加一个空格。这种方式需要自己去计算空格的个数,手动增加空格,比较麻烦且容易出错。事实上,我们完全可以用指定数据输出域宽的方式来替代这种加空格的方式。
指定输出域宽很简单,比如我们需要输出一个两位的整数,原来用的是%d,现在希望它占4列,那么将格式符改成%4d即可。输出的整数在4列内向右靠齐,左边自动补两个空格。在上述例子中,我们可以指定所有的数输出占4列,这样的话,不管是一位数还是两位数,都向右靠齐,一位数的左边自动补3个空格,两位数左边自动补2个空格,完全不用自己去计算空格个数和手动加空格。下面的三个程序采用了指定输出域宽的方式分别输出了三种形式的乘法表。
#include "stdio.h"
main()
{
int i,j;
//print the head
for(i=1;i<=9;i++)
printf("%4d",i);
printf("\n");
//print the separator
for(i=1;i<=9;i++)
printf("%4c",'-');
printf("\n");
//print the matrix
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
printf("%4d",i*j);
}
printf("\n");
}
}
#include "stdio.h"
main()
{
int i,j;
//print the head
for(i=1;i<=9;i++)
printf("%4d",i);
printf("\n");
//print the separator
for(i=1;i<=9;i++)
printf("%4c",'-');
printf("\n");
//print the matrix
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
{
printf("%4d",i*j);
}
printf("\n");
}
}
#include "stdio.h"
main()
{
int i,j;
//print the head
for(i=1;i<=9;i++)
printf("%4d",i);
printf("\n");
//print the separator
for(i=1;i<=9;i++)
printf("%4c",'-');
printf("\n");
//print the matrix
for(i=1;i<=9;i++)
{
for(j=1;j<=i-1;j++)
printf("%4c",' ');
for(j=i;j<=9;j++)
{
printf("%4d",i*j);
}
printf("\n");
}
}
注意,上面三个程序中,表头和分割线也是利用指定输出域宽的方法并借助循环来输出。