關於printf()函數和scanf()函數的解析

printf()函數和scanf()函數能讓用戶可以與程序交流,它們是輸入/輸出函數,簡稱I/O函數。
雖然printf()函數是輸出函數,scanf()函數是輸入函數,但是它們的工作原理幾乎相同。兩個函數都使用格式控制字符串和參數列表。我們先介紹printf(),再介紹scanf()函數。

  1. *printf()函數*
    

請求printf()函數打印數據的指令要與待打印數據的類型相匹配。例如,打印整數的%d,打印字符時使用的%c。這些符號被稱爲轉換說明(conversion specification),它們指定了如何把數據轉換成可顯示的形式。
下面列出一些常用的轉換說明及其打印的輸出結果:

%c——單個字符 
%d——有符號的十進制整數
%f——浮點數,十進制計數法
%p——指針
%s——字符串
%x——無符號十六進制整數,使用十六進制數0f
%%——打印一個%
  1.  這是printf()函數的格式:printf(“格式字符串”,待打印項1,待打印項2,.....);
    

待打印項1,待打印項2等都是要打印的項。它們可以是變量,常量,甚至是在打印之前先要計算的表達式。格式字符串應該包含每一個待打印項對應的轉換說明。例如,考慮下面的語句:

**printf(“The %d contestants are %f berry pies.\n”,numbers,pies);**

格式字符串是雙引號括起來的內容。上面語句的格式字符串包含了兩個待打印項number 和pies對應的兩個轉換說明。
警告:
格式字符串中的轉換說明一定要與後面的每個項相匹配,若忘記這個基本要求會導致嚴重的後果,千萬不要寫成下面這樣:
printf(“The score was Squids %d,Slugs %d.\n”,scores1);
這裏,第2個%d沒有對應任何項,系統不同,導致的結果也不同。不過,出現這種問題最好出現無意義的垃圾值。
如果只打印短語或者句子,就不需要使用任何轉換說明。如果只打印數據,就不用加入說明文字。
由於printf()函數使用%符號來標識轉換說明,因此打印%符號就成個問題,如果單獨使用一個%符號,編譯器會認爲漏掉一個轉換字符。解決方法很簡單,使用兩個%符號就好了:

**pc=2*6;
printf(“Only %d%% of Sally’s gribbles were edibls.\n”,pc);**

下面是輸出結果:

Only 12% of Sally’s gribbles were edibles.
  1. printf()的轉換說明修飾符
    

在%和轉換字符之間插入修飾符可修飾基本的轉換說明:
數字——最小字段寬度,如果該字段不能容納待打印的數字或字符串,系統會使用更寬的字段,示例:“%4d”
. 數字(ps:數字前面有個點)——精度,
注意:float參數的轉換
對於浮點類型,有用於double和long double類型的轉換說明,卻沒有float類型的,這是因爲在K&R C中,表達式或參數中的float類型值會被自動轉換成double型。
printf()函數中的標記:
“-”——待打印項左對齊。即,從字段的左側開始打印該項。 示例:“%-20s”
“+”——有符號值若爲正,則在值前面顯示加號;若爲負,則在值前面顯示減號。示例:“%+6.2f”
“空格”——有符號若爲正,則在值前面顯示前導空格(不顯示任何符號);若爲負,則在值前面顯示減號 示例:“% 6.2f”
“#”——把結果轉換爲另一種形式,如果是%o格式,則以0開始;如果是%x或者%X格式,則以0x或0X開始;對於所有的浮點格式,#保證了即使後面沒有任何數字,也打印一個小數點字符。對於%g和%G格式,#防止結果後面的0被刪除。示例:“%#o”,“%#8.0f”。
“0”——對於數值格式,用前導0代替空格填充字段寬度,對於整數格式,如果出現-標記或指定精度,則忽略該標記。 示例:“%010d”和“%0.8f”
例:/flags.c—演示一些格式標記/

**#include <studio.h>
int main(void)
{
  printf(“%x %X %#x\n”,31,31,31);
  printf(“**%d**% d**% d”,42, 42,-42);
  printf(“**%5d**%5.3d**%05d**%05.3d**\n”,6,6,6,6);
  return 0;
}**

該程序的輸出如下:

 1f 1F 0x1f
 **42** 42**-42**
 **     6**   006**00006**       006**

第1行輸出中,1f是十六進制數,等於十進制數31.第一行printf()語句中,根據%x打印出1f,%X打印出1F,%#x打印出0x1f。
第2行輸出演示瞭如何在轉換說明中用空格在輸出的正值前面生產前導空格,負值前面不產生前導空格。這樣的輸出結果比較美觀,因爲打印出來的正值和負值在相同字段寬度下的有效數字位數相同。
第3行輸出演示瞭如何讓在整型格式中使用精度(%5.3d)生成足夠的前導0以滿足最小位數的要求(本例是3)。然而0標記會使得編譯器用前導0填充整個字符寬度。最後,如果0標記和精度一起出現,0標記會被忽略。
4. 下面看看字符串格式的示例:

**/*stringf.c—字符串格式*/
#include <studio.h>
#define BLURB “Authentic imitation!”
int main(void)
{
     printf(“[%2s]\n”,BLURB);
     printf(“[%24s]\n”,BLURB);
     printf(“[%24.5s]\n”,BLURB);
     printf(“[%-24.5s]\n”,BLURB);
    return 0;
}**

該程序的輸出如下:

[Authentic imitation!]
[          Authentic imitation!] 
[                                 Authe]
[Authe                                 ]

注意,雖然第一個轉換說明是%2s,但是字段被擴大爲可容納字符串中的所有字符。還需注意,,精度限制了待打印字符的個數。.5告訴printf()只打印5個字符。另外,-標記使得文本左對齊輸出。

ps:關於scanf()函數將分另一張詳細講解!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章