簡體   English   中英

printf轉換的正確規則是什么?

[英]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-widthprecision ,因此將忽略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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM