将字符串数组转换为C中的字符串

时间:2015-03-19 15:53:58

标签: c arrays string type-conversion

我可能错过了这个问题的微妙之处,因为我在互联网上找不到相关结果,而我认为这是一个常见问题。

无论如何,这是我的问题:

我有一个字符串数组,我希望将它连接成一个字符串,从char **到char *。

是否有任何可用于此目的的函数,或者我是否必须为新字符串分配内存,并在循环中使用strcat()以逐个连接数组中的所有字符串?

提前致谢!

1 个答案:

答案 0 :(得分:4)

没有标准的库函数可以做到这一点。

最有效的解决方案是计算连接字符串的大小,然后将strcpy组件放入正确的位置。这需要跟踪字符串的大小,这有点开销,或扫描每个组件字符串的长度两次。

使用strcat将需要在每次连接时重新扫描构造的字符串,从而导致二次运行时间。但是,如果您知道在阵列中没有太多字符串并且操作不在关键循环中,则可能是可接受的。


这是一个简单的递归解决方案,用于演示目的。像所有递归程序一样,它应该在生产代码中谨慎使用,因为它有可能溢出调用堆栈,但它可以很容易地被修改成为迭代解决方案。

(标准迭代转换需要一个堆栈来保留递归函数的状态,但递归调用后所需的状态部分只包含my_len,可以重新计算。)

char* join_helper(char** in, size_t inlen, size_t inpos, size_t accum) {
  if (inpos == inlen)
    return strcpy(malloc(accum + 1) + accum, "");
  else {
    size_t mylen = strlen(in[inpos]);
    return memcpy(
      join_helper(in, inlen, inpos + 1, accum + mylen) - mylen,
      in[inpos], mylen);
  }
}

/* The string returned by this function is malloc'd and needs
 * to be free'd by the caller
 */
char* join(char** in, size_t inlen) {
  return join_helper(in, inlen, 0, 0);
}