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/ /_}#支持正怎表达式 / /表示搜索到第一个替换,// /表示搜索到的结果全部替换. ...
随机推荐
- vi / vim 设置
一.vi下方向键输入后,出现ABCD,解决方法: 在vi中输入:set nocp 按回车即可. 二.设置TAB缩进4个空格: 为了vim更好的支持python写代码,修改tab默认4个空格有两种设置方 ...
- 中矿新生赛 H 璐神看岛屿【BFS/DFS求联通块/连通块区域在边界则此连通块无效】
时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 璐神现在有张n*m大小的地图,地图上标明了陆地(用 ...
- Python的程序结构[2] -> 类/Class[6] -> 内建类 map
内建类map / Built-in Type map 关于内建类 map 是一个内建的类,能够返回一个 map 的 obj.map 的第一个参数为一个可执行函数,后续参数均为可迭代对象,map 会分别 ...
- 洛谷—— P3908 异或之和
https://www.luogu.org/problemnew/show/P3908 题目描述 求1 \bigoplus 2 \bigoplus\cdots\bigoplus N1⨁2⨁⋯⨁N 的值 ...
- EGS5在linux系统下安装过程
转载自52MC论坛 作者:xinruibj 平台:Fedora 13 内核版本为:2.6.33, g77版本为:3.4.6: 用户名为xinrui,下面出现这个文件夹xinrui时,修改为你自己的用户 ...
- First Missing Positive -- LeetCode
Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2,0] ...
- [BZOJ5289][HNOI2018]排列(拓扑排序+pb_ds)
首先确定将所有a[i]向i连边之后会形成一张图,图上每条有向边i->j表示i要在j之前选. 图上的每个拓扑序都对应一种方案(如果有环显然无解),经过一系列推导可以发现贪心策略与合并的块的大小和w ...
- Oracle PL/SQL入门之慨述
Oracle PL/SQL入门之慨述 一.PL/SQL出现的目的 结构化查询语言(Structured Query Language,简称SQL)是用来访问关系型数据库一种通用语言,它属于第四代语言( ...
- SQL SERVER Update from 使用陷阱
原文:SQL SERVER Update from 使用陷阱 update A set from A left join B on 此方法常用来使用根据一个表更新另一个表的数据,来进行数据同步更新.若 ...
- 了解RxJava以及如何在Android应用中使用它
如果你在阅读这篇文章,相信你一定很想了解RxJava以及如何在Android应用中使用它.可能你已经见过RxJava的代码了,但仍然有些疑惑,愿你能在这篇文章里找到答案. 当我第一次使用RxJava的 ...