[英]What are the proper rules for printf conversions?
我有此函數調用printf:
printf("%-+05.6d", 133);
輸出如下:
+000133
我在printf標志如何相互交互的規則上遇到了麻煩,因為似乎它們被賦予了沖突的規則。
根據該人 (man 3 printf)的說法:
0
The value should be zero padded. For d, i, o, u, x, X, a, A, e, E, f, F, g, and G conversions, the converted value is padded on the left with zeros rather than blanks. If the 0 and - flags both appear, the 0 flag is ignored. If a precision is given with a numeric conversion (d, i, o, u, x, and X), the 0 flag is ignored. For other conversions, the behavior is undefined.
因此,據此,應該忽略0標志,因為同時有一個'-'標志和一個指定的精度,但它仍在打印0。
據該男子的diouxX轉換:
The precision, if any, gives the minimum number of digits that must appear; if the converted value requires fewer digits, it is padded on the left with zeros.
因此,使用這兩個規則,似乎特定的diouxX轉換規則在這里適用,因為仍然打印0,但是為什么那個人說0被忽略了?
由於此處采用了精度,因此不應該忽略“ 0”標志並用空格填充嗎?
你一團糟。 0
被忽略,請嘗試:
printf("%-+5.6d", 133);
產量
+000133
您遇到的問題是指定了多個覆蓋標志。 你糾正舉一個-
左對齊)覆蓋0
。 在所有情況下,符號標志+
都在字符串前加+/-
。
下一個沖突是5.6
。 您將字段寬度修飾符指定為5
,然后將精度指定為6
。 對於d, i, o, u, x, and X
轉換, 精度指定將出現的位數 。 (請參閱C11標准-7.21.6.1 fprintf函數 )因此,盡管沒有特別說明,但精度大於字段寬度實際上會覆蓋字段寬度,除了會為133
打印+
號外,還會產生6-digits
。
因此,問題的症結在於“為什么-
如果覆蓋0
標志,仍然打印0s
?” 這里有一些技術上的毛發需要拆分。 由於您已指定-
(左對齊),並且同時指定了field-width和precision ,因此將忽略0
,但您已聲明應打印6位數字,並且結果將左對齊。 因此,您將根據precision
得到0s
,然后將數字的總數左對齊,並為符號提供顯式+/-
。
刪除精度,您將看到-
覆蓋0
的效果:
printf("%-+05.d", 133);
輸出:
+133
(有一個空的 在最后
3
,使字段總寬度為5
)
( 注意: -您能否依靠它的完全可移植性?-可能不會,在標准中可能還有一些實現定義的余地,用於標志序列解釋,這可能導致某些編譯器的標志順序略有不同)
根據您引用的文檔,格式中的0
將被忽略,這意味着它對輸出中是否為零沒有影響。 然后,您使用整數格式提供.6
的精度,這意味着結果必須顯示6個或更多數字。 您需要看到零來填充該最小位數。
如果格式不包含-
或.6
,則05
表示整數將至少包含5個字符,並用零填充,因此輸出為+0133
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.