C语言中的高效字符串连接

时间:2010-02-16 11:21:13

标签: c string-concatenation

这是我的问题:我有一个数组,其中包含命令a [1],后跟几个命令args a [2],a [3],...

我需要做的是以下

  • 创建一个字符串,由cmd和args组合组成 E.g:
  

cmd arg1 arg2 arg3

  • 执行该命令字符串

这是我如何做到的(伪代码):

  1. 预先计算每个arg的长度并将其存储在数组中
  2. 获取组合(使用GNU Scientific Library)
  3. 计算分配字符串所需的大小(字节数)(cmd + 1 +的长度) lengthof arg1 + 1 + argn-1 + 1)(+1通常用于空白和at 结束了\ 0)
  4. 使用strcat构建字符串
  5. 执行命令字符串
  6. 嗯,它有效,但我想知道是否故意使用strcat实际上是有效的/正确的方法。

    有什么建议吗?

4 个答案:

答案 0 :(得分:5)

不,使用strcat()效率不高,因为每次调用它时都必须单步执行字符串以查找结尾。

使用snprintf()如果你拥有它(并且可以在那里挤压你的参数),或者使用直接指针操作自己做的话,可以更好地做到这一切。

当然,为了实现这一点,你需要经常运行这个命令。

答案 1 :(得分:2)

如果你已经存储了每个组件字符串的长度,你可以使用memcpy使用正确的指针偏移来切换到,而不是使用strcat而不必找到字符串的那一端测试每个源char对'\0'的测试,但除此之外,你可以做的更多,以便更快地创建连接。

答案 2 :(得分:1)

strcat()以及标准库中的所有字符串操作函数都是低效的。这是因为字符串存储在C中,即零终止,因此每个函数必须通过迭代每个字符来找到字符串的结尾。

无论如何,你正在进行一个过早的优化:与命令执行相比,这里的多个strcat()调用执行速度非常快,所以你不必担心连接方式的效率。

在优化部分代码之前,您必须证明它是一个瓶颈,并且优化将真正改善执行时间。在大多数情况下,没有必要进行优化:根本不值得花时间。

答案 3 :(得分:0)

我会用sprintf来完成。