先記下代碼和運行結果
再解釋
#include <stdio.h> #include <stdlib.h> #include <limits.h> #define PAGES 959 int main(int argc,char* argv) { printf("*%d*\n",PAGES); printf("*%+2d*\n",PAGES); printf("*%10d*\n",PAGES); printf("*%-10d*\n",PAGES); printf("*%010d*\n",PAGES); printf("*%-010d*\n",PAGES); printf("*%-010.2d*\n",PAGES); printf("*%-010.5d*\n",PAGES); printf("*%010.5d*\n",PAGES); const double RENT = 3852.99; printf("----------------------------------\n"); printf("*%f*\n",RENT); printf("*%e*\n",RENT); printf("*%4.2f*\n",RENT); printf("*%3.1f*\n",RENT); printf("*%10.3f*\n",RENT); printf("*%10.3E*\n",RENT); printf("*%+4.2f*\n",RENT); printf("*%010.2f*\n",RENT); printf("*%-10.2f*\n"); return 0; }
結果為:
*959*
*+959*
* 959*
*959 *
*0000000959*
*959 *
*959 *
*00959 *
* 00959*
----------------------------------
*3852.990000*
*3.852990e+03*
*3852.99*
*3853.0*
* 3852.990*
* 3.853E+03*
*+3852.99*
*0003852.99*
*3852.99 *
說明:
首先這三種修飾符,即標記、數字和.數字,他們必須按照這個順序書寫,不能變換順序。
標記包括5種:+-空格#0
+:表示顯示符號位
-:待打印項左對齊,即待打印的項位於整個字段的最左邊。這里解釋一下,這里所說的字段是指整個轉換說明,比如"%-10d",這個字段不僅包括%d表示的數字還包含一些空格位,因為整個字段的長度為10個字符位,如果數字不夠則需要用空格填充,默認情況是空格填充在左側,但是使用了-符號后,數字要左對齊,就是數字出現在最左側,然后才是補充的空格。
空格:還沒明白,明白了再添加
#:用於顯示八進制和十六進制的前導符。
0:以0填充。前面說到不足的字符位默認是空格填充,如果使用0標記,則用0填充,當然,0填充只能是在數的前面(左側)填充,要不然數的大小就變啦!所以當使用-標記表示左對齊的時候0表示是沒有作用的。
數字修飾符:用於表示這個字段(前面已經解釋了字段的含義)所占的字符位的個數。例如%10d表示這個字段占10位,如果數字本身不足10位則默認情況用空格填充(填充在左側),如果數字本身已經超過10位,數字標記就不起作用了
.數字修飾符:對於整數,表示整數的最小位數,如%.5d ,如果數字本身的位數小於5位,則會填充0以達到五位數(填充位置自然是數的左側),如果數本身就大於5位,那么可以認為這個標記不起作用。
對於浮點數,表示的是小數點右邊的數字的位數,默認情況下浮點數好像會顯示小數點右邊的六位。
這三種修飾符通常情況下會一起使用,分析的時候一定要注意這三個修飾符出現的順序一定是先標記再數字最后是點數字(當然其中一項或多項沒有可以不使用)。牢記這一點然后再分析就容易了。
11月26日添加:
對於標記空格的理解:
先給出代碼:
#include <stdio.h> #include <stdlib.h> int main(int argc,char* argv) { printf("%d\t%d\t%d\t%d\t%d\t%d\n",32,950,621,-123456789,122); printf("%d\t%d\t%d\t%d\t%d\t%d\n",-32,12,-95,22,12,111); printf("----------------------------------------------------------------------------------------------------------------------\n\n\n"); // 添加數字標記使每個字段占用的字符位數相同 printf("%9d\t%9d\t%9d\t%9d\t%9d\t%9d\n",32,950,621,-123456789,122); printf("%9d\t%9d\t%9d\t%9d\t%9d\t%9d\n",-32,12,-95,22,12,111); printf("----------------------------------------------------------------------------------------------------------------------\n\n\n"); //添加-標記,使數字作對其 printf("%-9d\t%-9d\t%-9d\t%-9d\t%-9d\t%-9d\n",32,950,621,-123456789,122); printf("%-9d\t%-9d\t%-9d\t%-9d\t%-9d\t%-9d\n",-32,12,-95,22,12,111); printf("----------------------------------------------------------------------------------------------------------------------\n\n\n"); //添加空格標記,使正數前面生成前導空格 printf("% -9d\t% -9d\t% -9d\t% -9d\t% -9d\t% -9d\n",32,950,621,-123456789,122); printf("% -9d\t% -9d\t% -9d\t% -9d\t% -9d\t% -9d\n",-32,12,-95,22,12,111); printf("----------------------------------------------------------------------------------------------------------------------\n\n\n"); //多個空格呢,會當成一個空格來處理 printf("% -9d\t% -9d\t% -9d\t% -9d\t% -9d\t% -9d\n",32,950,621,-123456789,122); printf("% -9d\t% -9d\t% -9d\t% -9d\t% -9d\t% -9d\n",-32,12,-95,22,12,111); printf("----------------------------------------------------------------------------------------------------------------------\n\n\n"); //空格標記和-標記的順序調換一下 printf("%- 9d\t%- 9d\t%- 9d\t%- 9d\t%- 9d\t%- 9d\n",32,950,621,-123456789,122); printf("%- 9d\t%- 9d\t%- 9d\t%- 9d\t%- 9d\t%- 9d\n",-32,12,-95,22,12,111); printf("----------------------------------------------------------------------------------------------------------------------\n\n\n"); return 0; }
運行結果:

說明: 在轉換說明中使用空格標記的作用是:在輸出的正值前面生成前導空格,負值前面不產生前導空格,這樣輸出的結果比較美觀。
打印多行數據的時候,我們經常使用\t 來控制輸出,使輸出更加美觀。但是當數字的位數大於8的時候,用\t也不能完全解決(第一種代碼)。這時我們可以在轉換說明中加入數字修飾(第二種代碼),來控制每個字段所占字符的位數,我們發現,這種情況比上一種情況美觀了很多。但是有時候我們希望數據左對齊而不是右對齊,這時我們就可以在轉換說明中使用-標記(第三種代碼),采用的第三種代碼后,我們發現,輸出更加美觀了,但是仍然存在一個小的瑕疵,就是正數和負數不能對其,這個時候我們可以在轉換說明中再加入空格標記(第四種代碼),使得輸出更加美觀。最后我們測試了一下使用多個空格作為標記,發現效果和使用一個空格是一樣的(第五種代碼),也就是說轉換說明中使用空格標記,多個空格都被視為一個空格。最后我們還將空格標記和-標記的位置進行了調換(第六種代碼),發現和第五種情況一樣。說明,在轉換說明中使用標記時,對五種標記的順序沒有要求,但是切記,正如前面一再強調的那樣,標記修飾一定要在數字修飾的前面,數字修飾一定要在.數字修飾的前面。
補充:
對於整型變量來說,當0標記和.數字修飾同時使用時,零標記將失去作用。
