C的字符串操作接口实现
近期在写一个关于用HTTP控制storm的的UI功能。已经实现完毕,採用在nginx里面增加相应的模块调用来实现,模块中调用一个动态载入的SO。这个SO用THRIFT和zookeeper client实现对storm的控制和信息的存储固化。開始我使用了std::string来做字符串处理。后来发现string实在太多未知的对象构建和内存分配,加上我想把so改用纯C的实现。
std::string自然就须要被替换。在网络上找了非常久相关C语言的string
实现。没有。于是參照《C语言接口与实现》里字符串操作的实现接口,是实现了一个便捷的C字符串处理的接口。接口例如以下:
typedef char* cstring; /*init and destory*/
cstring cstr_init();
cstring cstr_initchar(const char* v, size_t v_size);
void cstr_destroy(cstring s); /*get string context*/
char* cstr_value(cstring s);
/*cstring size*/
size_t cstr_size(cstring s);
uint8_t cstr_empty(cstring s);
/*update size by '\0'*/
void cstr_update(cstring s);
/*cstring cat*/
cstring cstr_cat(cstring dst, cstring src);
cstring cstr_catchar(cstring dst, const char* v, size_t v_size);
/*cstring copy*/
cstring cstr_cpy(cstring dst, cstring src);
cstring cstr_cpychar(cstring dst, const char* v, size_t v_size);
/*cstring cmp*/
int32_t cstr_cmp(cstring s1, cstring s2);
int32_t cstr_cmpchar(cstring s, const char* v, size_t v_size);
/*cstring lower upper*/
void cstr_tolower(cstring s);
void cstr_toupper(cstring s);
/*del cset from cstring*/
cstring cstr_trim(cstring s, const char* cset);
void cstr_clear(cstring s);
/*sprintf format*/
cstring str_printf(cstring s, const char* fmt, ...);
/*number to cstring*/
cstring itocstr(cstring s, int64_t v);
/*cstring to number*/
int64_t cstrtoi(cstring s); /*cstring dump*/
void cstr_dump(cstring s);
#endif
当中cstring是一个字符串句柄,指向详细的字符串内容。cstring的前面还有8个字节。前面4个字节表示字符串的长度。后面4个字节表示缓冲区还剩余的长度。
其结构例如以下:
/*define string struct*/
typedef struct string_s{
int32_t len;<span style="white-space:pre"> </span>/*字符串的长度*/
int32_t free;<span style="white-space:pre"> </span>/*缓冲区还剩余的长度*/
char buf[];<span style="white-space:pre"> </span>/*cstring的指针地址*/
}string_t;
函数cstr_init()会为string_t开辟一个大于其sizeof大小的内存块。前面8字节用于struct结构信息的存储,后面用于字符串内容存储。
在调用类似cstr_cat函数假设free的内存不够时。接口会自己主动分配一个更大的内存块来取代。这样做的目的是为了调用者不用关心内存溢出的问题。
关于这个接口的所有代码实现。已经放到gti hub上,能够做为C的字符串操作的參考。
C的字符串操作接口实现的更多相关文章
- C 语言函数手册:涵盖字符测试、字符串操作、内存管理、时间换算、数学计算、文件操作、进程管理、文件权限控制、信号处理、接口处理、环境变量、终端控制
1. 字符测试函数 函数 说明 isascii() 判断字符是否为ASCII码字符 2. 字符串操作 函数 说明 gcvt() 将浮点型数转换为字符串(四舍五入) index() 查找字符串并返回首次 ...
- Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串
Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串 原理::syso 向ByteArrayOutputStream这个流理想write字节..然后可以使 ...
- 如何手动实现C语言中的字符串操作
学了字符串操作,很多人也许学了大概知道怎么用,但是太久没用就忘了,恰恰这是找软件工程师或者嵌入式工程师以及C,C++相关的笔试面试必考的题目!接下来我们来看看如何手动实现这些相关的函数. 废话不多说, ...
- SIM800/SIM900/SIM7000/SIM7600底层操作接口_句柄方式完全分离通信底层
使用SIMCOM公司通信模块将底层的通信与应用完全进行了分离,便于移植. SIMCOM.h //定义了相关的结构体与类型. SIMCOM_AT.c//定义了底层的AT接口 SIMCOM_GSM.c// ...
- 如何使用T-SQL备份还原数据库及c#如何调用执行? C#中索引器的作用和实现。 jquery控制元素的隐藏和显示的几种方法。 localStorage、sessionStorage用法总结 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一) span<T>之高性能字符串操作实测
如何使用T-SQL备份还原数据库及c#如何调用执行? 准备材料:Microsoft SQL Server一部.需要还原的bak文件一只 一.备份 数据库备份语句:user master backup ...
- day4-基础 字符串操作,文件操作,字符转编码
1.字符串用法 name = 'daniel' print(name.capitalize()) #首字母大写 >>>daniel print(name.count('a')) #统 ...
- Python数据科学手册-Pandas:向量化字符串操作、时间序列
向量化字符串操作 Series 和 Index对象 的str属性. 可以正确的处理缺失值 方法列表 正则表达式. Method Description match() Call re.match() ...
- python学习笔记(字符串操作、字典操作、三级菜单实例)
字符串操作 name = "alex" print(name.capitalize()) #首字母大写 name = "my name is alex" pri ...
- shell编程常用的截取字符串操作
1. 常用的字符串操作 1.1. 替换字符串:$ echo ${var/ /_}#支持正怎表达式 / /表示搜索到第一个替换,// /表示搜索到的结果全部替换. ...
随机推荐
- Codeforces Gym100952 B. New Job (2015 HIAST Collegiate Programming Contest)
B. New Job time limit per test 1 second memory limit per test 64 megabytes input standard input ...
- HDU 1541.Stars-一维树状数组(详解)
树状数组,学长很早之前讲过,最近才重视起来,enmmmm... 树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据 ...
- CodeForces 450B Jzzhu and Sequences 【矩阵快速幂】
Jzzhu has invented a kind of sequences, they meet the following property: You are given x and y, ple ...
- SRM 733 Div 1 爆零记
开场写easy(有预感要FST) 然后medium就卡住了. 我只知道$n$个点的生成树个数是$n^{n-2}$ 接下来直接狗带…… $Problem 250pts$ 水题,直接枚举然后记录答案(我大 ...
- Cosmos DB
类似的数据库还有Google的Spanner. 参考:官网说明 另一个介绍 Key capabilities As a globally distributed database service, A ...
- bzoj2440(莫比乌斯函数)
bzoj2440 题意 求第 k 个不是完全平方数(除 1 以外)的正倍数的数. 分析 利用二分法求解,二分 x ,判断 x 是否是第 k 个数即可,那么我们就要计算 [1, x] 有几个符合条件的数 ...
- 理解竞争条件( Race condition)漏洞
这几天一个叫做"Dirty COW"的linux内核竞争条件漏洞蛮火的,相关公司不但给这个漏洞起了个洋气的名字,还给它设计了logo(见下图),首页,Twitter账号以及网店.恰 ...
- rsync + inotify 同步
1. 配置rysnc server:同步机,同步被同步机更新的文件,很多台vi /etc/rsyncd.conf uid=rootgid=rootuse chroot=nomax connection ...
- How to show only next line after the matched one?
awk '/blah/{getline; print}' logfile
- 洛谷 P4551 最长异或路径
题目描述 给定一棵 nn 个点的带权树,结点下标从 11 开始到 NN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有节点权值的异或. 输入输出格式 输入格式: ...