讀古今文學網 > C語言解惑 > 2.1 printf輸出的小奧妙 >

2.1 printf輸出的小奧妙

需要注意printf輸出字符串時,「\n」之前和之後的空格含義不同,前面的空格沒有影響,即如下兩條語句


printf 
("Hardness=%d   \n"
,2
);
printf 
("Hardness=%d\n "
,2
);
  

的輸出是對齊的。而下面兩條語句


printf 
("Hardness=%d\n  "
,2
);
printf 
("Hardness=%d\n "
,2
);
  

的輸出是不對齊的,輸出為


Hardness=2
  Hardness=2
  

即第2條語句前面的空格數由第1條語句「\n」後面的空格數決定。當要輸出多行左對齊的信息時,要特別注意。例如原來是想輸出左對齊,但語句


double a=5.8
,b=9.6
;
printf 
( "%f\n    "
,a
);
printf 
( "%f\n"
,b
);
  

的輸出則為


5.800000
    9.600000
  

這是因為在兩個雙引號之間的空格也是輸出信息的組成部分,輸出換行之後,信息並沒有輸出完畢,後面的空格被輸出到下一行,造成第2個輸出語句從空格之後開始。看看下面程序的運行結果,就會恍然大悟。


#include <stdio.h>
void main
()
{
     double a=5.8
,b=9.6
;
     printf 
("a=%f\nb=%f\n"
,a
,b
);
     printf 
("We are Here
!\nWhere are you
?\nBye
!\n"
);
}
  

輸出結果如下。


a=5.800000
b=9.600000
We are Here
!
Where are you
?
Bye
!
  

printf函數的一般格式為


printf
(格式控制,輸出量表);
  

格式控制是用雙引號("")引起來的字符串,也稱「控制字符串」。它包括普通字符串和格式說明。其中普通字符串是需要原樣輸出的字符,遇到「\n」則換到下一行。格式說明由「%」和格式符(d、f、c、s、o、x、u等)組成(如%d和%f等)。它的作用是將輸出的數據轉換為指定格式輸出。格式說明總是由「%」字符開始,但必須符合要求。如下語句


int a=45
;
printf
("%%d\n"
,a
);
  

多了一個「%」號,輸出的結果就是錯的。

【例2.1】能給出如下語句的輸出結果嗎?


#include <stdio.h>
void main
()
{
     double a=5.8
,b=9.6
; int d=98
; 
     char s='w'
,st="OK"
;
     printf 
("a=%F\nb=%f\n"
,a
,b
);
     printf 
("d=%D\nd=%d\n"
,d
,d
);
     printf 
("s=%C\ns=%c\n"
,s
,s
);
     printf 
("s=%S\ns=%s\n"
,st
,st
);
}
  

不能!因為格式符沒有規定大小寫之分,所以必須區別對待。以VC(Visual C的簡寫)為例,對於十進制數值,只能是小寫字符,所以%F和%D是無效的。對字符而言,大小寫均可(%c與%C等效),但對字符串,則只能用%s,不能用%S。不同的編譯系統可能也有區別。雖然從下面的輸出結果中可以看出一些規律,但變量d的地址與機器的硬件有關。


a=
,b=5.800000
d=D
,d=21
d=15
,d=15
d=O
,d=25
s=w
,s=w
st=
,st=OK
p=U
,p=1245036
  

它們對小寫總是有效的,所以不要去記它們,統一使用小寫字母即可。另外,對格式符進行修飾的long,則既可以使用小寫字母l,也可以使用大寫字母L。

最容易混淆的還是%c和%s。程序語句


char c1='W'
,c2='e'
,st="We"
;
printf 
("%c%c
,%s\n"
,c1
,c2
,st
);
  

的輸出是「We,We」。不要混用格式符,下面的語句


double a=3.5
;
printf
("%d\n"
,a
);
  

的輸出結果是錯的(輸出0),原因是錯用了格式符%d(應該使用%f)。