C语言本身的字符串函数库非但不全,而且有某些安全隐患,如以’\0’为字符串结尾,但’\0’本身实际为一字符。还有strtok在多线程下的问题等。其它语言常见的一些函数,如mid ,split等也都欠奉。Better String Library,即bstrlib库的设计目标是为解决这一问题,这个库完全独立于系统平台,推荐代替标准C字符串库使用。对于C++而言,bstrlib拥有一个健壮的C++包装器,通过重载操作符,丰富的构造器等,实现比std::string更多的功能和更好的性能。
一个bstring结构如下:
struct tagbstring { int mlen; int slen; unsigned char * data; };
在bstrlib解压缩后的btest.c中有各函数用法的例子。
bstrlib在说明中对以下字符串库进行了介绍或比较,无时间仔细研究专业术语,反正bstrlib很厉害的样子!
Comparison with Microsoft's CString class Comparison with C++'s std::string Comparison with ISO C TR 24731 proposal Comparison with Managed String Library CERT proposal Comparison with Annexia's c2lib library Comparison with stralloc/qmail wxString class Vstr Str Library libmib astrings libclc fireString Safe C String Library
在bsplit函数族中,返回的bstrlist结构如下。可以看到,在C中, 仍可以c标准字符串的形式调用其中的值。
struct bstrList { int qty, mlen; bstring * entry; };
bstrlib的使用很简单:
bstrlib.h
bstrlib.c
包含入工程即可,其它几个文件不是必需的。
bfromcstr(char *)将把一个C字符串转化为bstring。
bsplit将返回一个bstrlist结构,那么其中有几个bstring呢?bstrlist->qty是实际读出的个数。
bstrcmp 用于两个bstrng字符串进行比较。
当然对bstring 和bstrlist在使用完后,需调用bstrListDestroy之类销毁之。
2012.9.8补充:bstring结构中,mlen是分配空间的最小长度,slen是字符串的确切长度。通过:
extern char * bstr2cstr (const_bstring s, char z);
可将bstring转换为char *的形式,其中char Z是bstring中空字符’\0’的替换。然而转换出来的char *也需用bcstrfree或free等释放。
使用bstr2cstr似乎并非必要,在bstrlib本身提供的例子中,也用bstring->data来取得char *形式的串值,用bstring->slen来取得串的长度。注意bstring的串是\0字符无关的,它并不使用\0来分界串的结束。
bstring本身的释放,可用bdestroy(bstring a)的形式。
原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/374.html