聲明:這些內容主要是面向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");
}
}
注意,上面三個程序中,表頭和分割線也是利用指定輸出域寬的方法並藉助循環來輸出。