1. 苏葳的备忘录首页
  2. 编程

C语言的字符串库Bstrlib

c语言 bstrlibC语言本身的字符串函数库非但不全,而且有某些安全隐患,如以’\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

发表评论

邮箱地址不会被公开。 必填项已用*标注