2014-10-09 67 views
3
格式化字符串

讓我們以下面的程序:關於用C

#include <stdio.h> 

int main() 
{ 
    long t =57 ; 
    printf("[%+03ld]", t); 
} 

,它的輸出:

[+57] 

我莫名其妙地感到困惑:我告訴他墊的輸出寬度3(03ld ),但爲零,但如果強制輸出在數字前加一個加號(+),如果該數字的長度已經是2位數(如57),它不會添加所需的零。對於數字< 10它填充1個零。

http://www.cplusplus.com/reference/cstdio/printf/

(0) - >左墊用零的數目(0)而不是空格配置的填充時(參見寬度子說明符)。

(+) - >即使對於正數,強制在結果前加上加號或減號(+或 - )。默認情況下,只有負數前面帶有 - 符號。

(寬) - >要打印的最少字符數。如果要打印的值小於此數字,則結果將填充空白。即使結果較大,該值也不會被截斷。

所以我只需要澄清...上方從報價的(width)說明符指的是輸出的字符串(即:將要打印的字符)的整個長度由該格式說明("%+03ld")控制或要打印的號碼字符的全長?

+1

「(寬度) - >最小字符數_要打印_」。我不知道你還需要什麼;這要儘可能清楚。 – 2014-10-09 08:28:51

回答

3

是的,寬度說明符是指整個格式化結果的寬度,+57在您的情況。這對於打印柱狀文本以方便在屏幕上閱讀很有用(對於使用C編寫舊式文本實用程序很重要!)。

1

正如您所引用的「最少要打印的字符數」,所以「+」只是printf的另一個字符。順便說一句零「0」只是字符,也與數字無關。它可以是任何角色。

1

是,場寬度指的是完整的,換算值包括小數點,招牌等

2

C標準是相當精確的是轉換後的值取一個整體。從C11§7.21.6/ 2(重點煤礦):

fprintf功能將輸出寫入到stream指向stream, 下字符串的控制由格式指定指向 後續的參數是如何轉換爲輸出

與§7.21.6/ 4沿着:

可選最小字段寬度。如果轉換後的值的字符數比字段寬度少,則會在左側(或右側,如果已經給出左側調整標誌,後面將介紹 )填充空格(默認情況下爲 )爲字段寬度。字段寬度 採用星號*(稍後介紹)或非負十進制整數的形式。

1

您要求輸入3個字符的長度格式並獲得3個字符+57。如果你想讓0出現,只需使用printf("[%+04ld]", t);,你會得到+057