2020年5月16日 星期六

The format of xxprintf function in C99

前幾天為了打印一些數值在 Log,使用了 "%02.2f",不料結果卻不符預期,還是回到 Spec 一探究竟。

這個說明是在 7.21.6 Formatted input/output functions 的 7.21.6.1 The fprintf function

The description of format

% flags field-width precision length specifier(d, f, x ...)
(except specifier, all of them are optional)

其中在 0 flag 這一小段中有提到:
For d, i, o, u, x, and X conversions, if a precision is specified, the 0 flag is ignored. For other conversions, the behavior is undefined.

我原本以為是 0 不能與 precision 共用,但我記得我 10 幾年前剛學 C 語言時,有小數點的還是可以漂亮對齊的,難道是我記錯了?

後來嘗試幾種排列組合,終於可以對齊了,嘗試的結果 field-width 應該是有包含小數點及小數點位數?

明明有 Spec 還是看不懂,我的英文真的有待加強。


2020/05/17 更新

1. 今天再看了一次 Spec,field-width 提到如果轉換後的 values 有的 characters 比 field-width 少,則補 spaces on the left。
An optional minimum field width. If the converted value has fewer characters than the field width, it is padded with spaces (by default) on the left (or right, if the left adjustment flag, described later, has been given) to the field width. The field width takes the form of an asterisk * (described later) or a nonnegative decimal integer.

2. 我們一般習慣使用 field-width 去指定 int 個數,例如 "%04d",其實也可以用 precision,他就是用來指定最小位數,只是對 int 及 float 有不一樣的用法。
An optional precision that gives the minimum number of digits to appear for the d, i, o, u, x, and X conversions, the number of digits to appear after the decimal-point character for a, A, e, E, f, and F conversions.

沒有留言:

張貼留言