nginx開發:ngx_sprintf


格式化參數%系列,如果誤用的話,輕則輸出不正確,重則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要傳指針。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM