好的C字符串库

cha*_*its 27 c string io search

我最近受到启发,启动了一个我想要编写一段时间的项目.我想在C中做,因为内存处理是这个应用程序的关键.我正在四处搜索C中字符串的良好实现,因为我知道我自己这样做会导致一些混乱的缓冲区溢出,我希望处理相当多的字符串.

我发现这篇文章详细介绍了每一个,但他们每个人都觉得他们有很多利弊(不要误会我的意思,这篇文章非常有帮助,但它仍然让我担心,即使我是选择其中之一,我不会使用我能得到的最好的).我也不知道这篇文章是如何更新的,因此我目前的请求.

我正在寻找的是可以容纳大量字符的东西,并简化了搜索字符串的过程.如果它允许我以任何方式标记字符串,甚至更好.此外,它应该有一些非常好的I/O性能.打印和格式化打印不是最重要的.我知道我不应该指望一个库为我做所有的工作,但是如果那里有一个记录良好的字符串函数可以节省我一些时间和一些工作只是徘徊.

任何帮助是极大的赞赏.提前致谢!

编辑:我被问及我喜欢的许可证.任何类型的开源许可都可以,但最好是GPL(v2或v3).

EDIt2:我找到了betterString(bstring)库,它看起来很不错.良好的文档,小而多功能的功能,并且易于与c字符串混合.有没有关于它的好故事?我读到的唯一缺点是它缺乏Unicode(再次,读到这个,还没有看到它面对面),但其他一切似乎都很好.

EDIT3:另外,最好是纯C.

Ste*_* Wu 28

这是一个老问题,我希望你已经找到了一个有用的问题.如果您不这样做,请查看github上的Simple Dynamic String库.我在这里复制并粘贴作者的描述:

SDS是C的字符串库,旨在通过添加堆分配的字符串来增强有限的libc字符串处理功能:

  • 使用起来更简单.
  • 二进制安全.
  • 计算效率更高.
  • 但是......兼容普通的C字符串函数.

这是使用替代设计实现的,其中我们使用二进制前缀而不是使用C结构来表示字符串,而是存储在SDS返回给用户的字符串的实际指针之前.

+--------+-------------------------------+-----------+
| Header | Binary safe C alike string... | Null term |
+--------+-------------------------------+-----------+
         |
         `-> Pointer returned to the user.
Run Code Online (Sandbox Code Playgroud)

由于在实际返回的指针之前存储的元数据作为前缀,并且由于每个SDS字符串隐含地在字符串的末尾添加空术语,而不管字符串的实际内容如何,​​SDS字符串与C字符串和用户可以与以只读方式访问字符串的实际函数互换使用它们.

  • 您可能想提一下它是由 Redis 使用的,并且作者是 Redis 的主要作者? (2认同)

R..*_*R.. 9

我建议不使用任何库除了malloc,free,strlen,memcpy,和snprintf.这些功能给你所有的工具,功能强大,安全,高效的字符串处理C.刚刚远离strcpy,strcat,strncpy,和strncat,这一切都会导致效率低下和利用的bug.

既然你提到的搜索,你做任何图书馆的选择,strchr并且strstr几乎肯定会是您要使用的东西.strspn并且strcspn也很有用.

  • @Benoit:基本上不可能正确使用`strcat`,因为要知道新部件是否适合你的缓冲区,你需要知道字符串长度和缓冲区大小.`strcat'不仅浪费地重新计算前2个,而且还使你很容易忽略你不知道它们是否适合缓冲区的事实.如果你不使用`strcat`,你肯定会有适当的长度.`strcpy`并不坏,但同样适用.请注意,使用`strcat`逐个构造字符串也恰好是"O(n ^ 2)". (4认同)
  • 你忘记了'memmove`.那个人很有帮助. (3认同)
  • 在这种情况下,我会不同意@R .. Postfix和Qmail有自己的字符串处理例程,GNU项目有很多障碍,而且我之前已经完成了自己的工作.我喜欢一个高级库,用于动态分配字符串,而不是低级别的`str*()`用于任何中等复杂的(即使该库包含一个用于创建/附加到字符串的函数). (2认同)