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要传指针。

posted @ 2020-06-22 19:07  jiangcheng_15  阅读(1397)  评论(0编辑  收藏  举报