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的字符串操作的參考。

git地址https://github.com/yuanrongxi/c_string

时间: 2024-12-23 11:49:06

C的字符串操作接口实现的相关文章

python之socket实现unix socket及dash字符串操作

python的socket库可以实现tcp和udp,在linux下unix socket也是可以的,有些程序在进程间通信就是使用unix socket,如果我们想查看其通信的信息来进行调试,则可以用python来伪造其接口,获取内容 参考:https://docs.python.org/2/library/socket.html import socket import os  if __name__ == '__main__':          sock = socket.socket(so

条件、循环、函数定义、字符串操作练习

注意标准库的两种导入与使用方式,建议大家采用<库名>.<函数名>的方式. 对前面的代码进行优化,用for,while,if,def实现: 用循环画五角星 1 import turtle 2 3 turtle.fillcolor("red") 4 turtle.begin_fill() 5 for i in range(5): 6 turtle.forward(100) 7 turtle.right(144) 8 turtle.end_fill() 用循环画同心圆

PHP字符串操作大集合

字符串的处理非常重要.文本字符串中的空格或者其他没有意义的符号.例如,在一个电子商务应用中,当用户填写订单的内容时(如联系地址),可能输入一些空格.句号等PHP4及以上版本提供了4个去除字符串str首尾处空格或其他特殊符号.     string ltrim(string str [, string charlist]):去除字符串str尾的空格或其他特殊符号.     string chop(string str [, string charlist]):功能同rtrim(). 以上函数的第1

C语言难点1之输入输出,链接,字符串操作

C语言难点1之输入输出,链接,字符串操作 最近发现写了一段时间的C之后,还是有一些点并没有很好的get,我就想总结出来,写个系列博客,自己也好好的整理一下思路.这个系列主要出自三本书:<C专家编程>,<C陷阱和缺陷>,<C和指针>.有兴趣的同学可以好好看一下这几本书,对于打好C语言的基础是个非常不错的几本书. 1 一些输入输出的格式 对应的printf():和scanf()函数:在这里我给出常用的scanf格式码,和printf()函数也是一样的. 2 getchar(

C语言字符串操作总结大全(超详细)

1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecmp忽略大小写比较字符串strncmp(p, p1, n) 比较指定长度字符串 strchr(p, c) 在字符串中查找指定字符 strrchr(p, c) 在字符串中反向查找 strstr(p, p1

linux shell 字符串操作(长度,查找,替换)详解

原文地址:http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同     ${var-DEFAULT}

c语言中字符串操作的工具类

 1.编写头文件 #define _CRT_SECURE_NO_WARNINGS //#pragmawarning(disable:4996) #include <stdio.h> #include <stdlib.h> #include <string.h> struct CString { char *p;        //保存字符串首地址 int reallength; //实际长度 }; typedef struct CString mystring;//

Python字符串操作

isalnum()判断是否都是有效字符串 ? 1 2 3 4 5 6 7 8 9 10 11 12 >>> ev1 = 'evilxr' >>> ev2 = 'ev1il2xr3' >>> ev3 = '.,/[email protected]#' >>> a = ev1.isalnum() >>> print a True >>> b = ev2.isalnum() >>> pr

JavaScript中常见的字符串操作函数及用法汇总

1.字符串转换 字符串转换是最基础的要求和工作,你可以将任何类型的数据都转换为字符串,你可以用下面三种方法的任何一种: ? 1 2 var num= 19; // 19 var myStr = num.toString(); // "19" 你同样可以这么做: ? 1 2 var num= 19; // 19 var myStr = String(num); // "19" 或者,再简单点儿: ? 1 2 var num= 19; // 19 var myStr =