格式化參數%系列,如果誤用的話,輕則輸出不正確,重則nginx可能core。
1. 格式:
%{格式描述}{輸出類型描述}{數據類型描述}
2. 數據類型描述:
V:字符串,對應ngx_str_t *(注意是指針)
v:變量值,對應ngx_variable_value_t *(也是指針)
s:可定長字符串,對應uchar *(不使用定長功能的話,等價於標准C的s)
O:偏移量,對應off_t
P:進程ID,對應ngx_pid_t
T:時間,對應time_t
M:毫秒計時,對應ngx_msec_t
z:容量,對應ssize_t或size_t
i:nginx整數,對應ngx_int_t
d:系統整數,對應int
l:系統長整數,對應long
D:32位整數,對應int32_t或uint32_t
L:64位長整數,對應int64_t或uint64_t
A:原子整數,對應ngx_atomic_int_t或ngx_atomic_uint_t
f:浮點數,對應double,但是如果傳入的參數是float,也會被C升級為double。
p:指針,對應void *
c:字符,對應int,但是如果傳入的參數是char,也會被C升級為int。
Z:字符串尾0
N:換行
%:%
這里之所謂強調類型描述符,是因為這個類型在不同的系統下定義的長度不一(32位和64位系統),如果亂用,會導致移植性差。
3. 輸出類型描述符
u:無符號數值
m:指定按數據類型的最大值所占寬度輸出數字
x:小寫16進制
X:大寫16進制
.:后面的數字表示小數位數
*:指定輸出字符串直至字符長度限制
這里需要說明的是輸出類型描述符無法單獨使用,必須與數據類型描述符一同使用,這和標准C是可能不一樣的。
4. 格式描述
描述輸出的寬度和填充內容,填充內容以%后第一個數字而定,‘0’代表以‘0’填出,其他內容則使用默認的‘ ’填充。寬度描述則是填充設定以后的數字。整個格式描述類似於021、2等等。
5. 整體舉例
%5.2f:寬度5,小數位數2,輸出double
%*s:限定長度輸出字符串,數據定義需要兩個參數,length和ptr
% 010ud,寬度10,以0補齊,輸出unsigned int(新浪博客吃字符,所以在%和0之間加了空格,實際沒有的)
% 10ui, 寬度10,以空格補齊,輸出ngx_uint_t(同上)
ngx_sprintf()
函數用來拼字符串。
第一個參數傳buffer地址,可以通過直接加指針值的方法,傳某個原有字符串中間的地址,達到靈活修改字符串的目的;
第二個參數傳格式,是nginx自定義的格式,因為它封裝了字符串嘛,不得不自定義。最常用的是%V,代表ngx_str_t;
后面的變長參數就是傳變量了,記得ngx_str_t要傳指針。