第一个数据结构ngx_str
来源:互联网 发布:api原油库存今天数据 编辑:程序博客网 时间:2024/06/05 13:30
第一个数据结构 ngx_str:
ngx_str 在core\ngx_string里面。 字符串的重要性咱就不用多说了。反正基本上就是没有啥程序不用到字符串操作的。
打开ngx_string 首先看到的就是咱们的ngx_str的定义
typedefstruct {
size_t len;
u_char *data;
} ngx_str_t;
特别的简单粗暴,保存一个指针,再保存一个长度就收工了。或许你会感觉 这个len 可以不需要要嘛,最多是节约下 获取长度的时候进行的strlen操作嘛。具体是为啥,看了下面的定义就知道了。
#define ngx_string(str) { sizeof(str) - 1, (u_char *) str }
#define ngx_null_string { 0, NULL }
#define ngx_str_set(str, text) \
(str)->len = sizeof(text) - 1; (str)->data = (u_char *) text
从上面的初始化和赋值函数上来看。在长度的这块并不是使用常规的方式,调用的strlen。而是使用的sizeof操作。所以,咱们保存的data不是必须是以'\0'结尾的字符串。所以在操作上会有很大的不同,咱们也需要时刻记住,这货遇到'\0'也不一定后面就没了。所以说初始化的话 咱们就可以酱紫
ngx_str_t magic = ngx_string("magic");
ngx_str_t null_str =ngx_null_string;
改变值的话:
ngx_str_set(&magic,"hello");
如果来个
magic = ngx_null_string;
酱紫就是错误的。具体的错误喃,属于C语言基础上的。
下面说下对操作:
因为咱们保存的data不是以'\0'结尾的,所以在很大程度的操作上,会有很大的问题,因为大家都知道系统提供的api,都是以'\0',所以一般在取出data进行操作的时候,要么是拷贝个出来,把它加上'\0',要么是暴力的在data后面加个'\0',然后完了换回去,不过后面那种操作可能会存在问题,就是这个会不会越界啥的。
#define ngx_tolower(c) (u_char) ((c >= 'A' && c <='Z') ? (c | 0x20) : c)
#define ngx_toupper(c) (u_char) ((c >= 'a' && c <='z') ? (c & ~0x20) : c)
大小写转换的函数void ngx_strlow(u_char *dst,u_char *src, size_t n);
把src转换为小写,赋值给dst。不改变src。一般来说,要注意的问题就是两个的内存大小都要有n。不然你懂的。#define ngx_strncmp(s1, s2, n) strncmp((const char *) s1, (const char *) s2, n)
#define ngx_strcmp(s1, s2) strcmp((const char *) s1, (const char *) s2)
#define ngx_strstr(s1, s2) strstr((const char *) s1, (const char *) s2)
#define ngx_strlen(s) strlen((const char *) s)
#define ngx_strchr(s1, c) strchr((const char *) s1, (int) c)
这些经常看到没啥说的 都是保证咱们命名规则嘛。static ngx_inlineu_char *
ngx_strlchr(u_char *p,u_char *last, u_char c);
p为开始,last为结束,找到一个c的位置。
u_char * ngx_cdecl ngx_sprintf(u_char *buf,const char *fmt, ...);
u_char * ngx_cdecl ngx_snprintf(u_char *buf,size_t max, constchar *fmt, ...);
u_char * ngx_cdecl ngx_slprintf(u_char *buf,u_char *last, constchar *fmt,
...);
u_char *ngx_vslprintf(u_char *buf,u_char *last, constchar *fmt, va_list args);
#define ngx_vsnprintf(buf, max, fmt, args) \
ngx_vslprintf(buf, buf + (max), fmt, args)
/*
* supported formats:
* %[0][width][x][X]O off_t
* %[0][width]T time_t
* %[0][width][u][x|X]z ssize_t/size_t
* %[0][width][u][x|X]d int/u_int
* %[0][width][u][x|X]l long
* %[0][width|m][u][x|X]i ngx_int_t/ngx_uint_t
* %[0][width][u][x|X]D int32_t/uint32_t
* %[0][width][u][x|X]L int64_t/uint64_t
* %[0][width|m][u][x|X]A ngx_atomic_int_t/ngx_atomic_uint_t
* %[0][width][.width]f double, max valid number fits to %18.15f
* %P ngx_pid_t
* %M ngx_msec_t
* %r rlim_t
* %p void *
* %V ngx_str_t *
* %v ngx_variable_value_t *
* %s null-terminated string
* %*s length and string
* %Z '\0'
* %N '\n'
* %c char
* %% %
*
* reserved:
* %t ptrdiff_t
* %S null-terminated wchar string
* %C wchar
*/
支持的类型
来看
ngx_vslprintf(u_char *buf,u_char *last, constchar *fmt, va_list args)
buf 要写入的but
last buf的结束位置
fmt 格式
args 参数
一般来说最好使用带有buf长度,避免溢出。
剩下的函数都是比如base64_encode 都是一些常规函数,可以用的时候看
- 第一个数据结构ngx_str
- nginx源码初读(4)--让烦恼从数据结构开始(ngx_str)
- 【数据结构】第五天
- 数据结构第一周小结
- 数据结构第1讲
- 数据结构 第四季
- 数据结构--第一篇 绪论
- 第9章 数据结构
- 第9章 数据结构
- 第 10 章 数据结构
- 1、数据结构第一天
- 第9章 数据结构
- 第四次数据结构上机
- 数据结构 第1章 数据结构概论
- 数据结构一:数据结构概论(第一周)
- 数据结构知识一个基础
- 推荐一个数据结构网站
- 如何设计一个数据结构
- js删除json数组中指定数组
- 51nod 1031 骨牌覆盖
- UNIX_C 高级编程<二>
- 数据分析领域中最为人称道的七种降维方法
- CAP理论
- 第一个数据结构ngx_str
- Asp.net使用Table标签填充数据库数据
- LeetCode--373. Find Pairs with Smallest Sums
- HDU 3065病毒侵袭持续中 ac自动机
- HDU Life 5754 Winner Bo 各类博弈
- 第五天作业
- POJ 3260 DP
- poj 3714 japan (分治)
- 51单片机之外设——点亮LED