【问题标题】:Building a string character by character逐个字符地构建字符串
【发布时间】:2013-12-02 01:12:12
【问题描述】:

我正在使用包含分隔字符串的字符流(不可搜索):例如abc|def|ghijkd 带有分隔符 |。因此,当我解析一个标记时,我不断将流的字符添加到一个字符串中,直到找到一个管道,然后我开始一个新的字符串。

我不想在每次添加新字符时复制正在构建的字符串。

构建先验未知长度的字符串的标准做法是什么?

我现在所做的基本上是分配一个给定大小的“块”(比如 256 个字符)并将流中的字符复制到那里。当块已满时,我增加块大小(以初始块大小为步长),分配一个新块,将旧块复制到新位置,释放旧块,将字符添加到新块的末尾等,冲洗并重复。这对我来说有点像大锤。

【问题讨论】:

  • 你可以使用std::string吗?这会很容易。
  • @edtheprogrammerguy 这在我看来就像 C++。你确定这是 C 吗?
  • std::string 在 C 中不可用

标签: c string c99


【解决方案1】:

您所做的基本上是realloc 所做的,只是它只会在无法放大块时复制。标准做法是每次将块的大小加倍。指数增长将限制所需的重新分配次数。

【讨论】:

  • 谢谢,我会调查realloc。听起来这就是我要找的东西。
  • 我应该提到,在最坏的情况下,将块大小加倍可能会导致您的字符串消耗几乎两倍于所需的内存。如果您对此感到担忧,只需在完成字符串时执行最后的realloc,将块的大小调整为您需要的确切大小。
猜你喜欢
  • 2013-01-18
  • 1970-01-01
  • 2020-01-20
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
相关资源
最近更新 更多