将字符串数组转换为一个字符串在C中

4
我可能在这个问题上缺少一些细节,因为我在检索相关结果时没有找到常见的信息。无论如何,这是我的问题:
我有一个字符串数组,我想把它们连接成一个单独的字符串,从char **到char *。是否有任何可用于此目的的函数,或者我必须分配新字符串的内存,并使用strcat()在循环中逐个连接数组中的所有字符串?
提前感谢您!

数组中的字符串数量是否会变化? - Ulfalizer
它确实会影响,但这并不麻烦,因为我有办法知道它。 - Tohkai
1
反正这也不会有太大的区别。glibc有一个asprintf(3)函数,它为您分配目标字符串,您可以使用asprintf(&concat, "%s%s%s", s[0], s[1], s[2])来节省一些工作量,但它是非标准的。 :) - Ulfalizer
你说你通常有一个字符串数组,偶尔想将其视为单个字符串...如果你的正常情况是一个单独的字符串,偶尔将其切成以前的数组成员,怎么办?只是试图从不同的角度来看待它... - Mawg says reinstate Monica
嗯,我不知道?我想将它作为一个参数传递给一个接受单个字符串的函数,所以... - Tohkai
显示剩余2条评论
1个回答

4

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

最有效的解决方案是计算连接后字符串的大小,然后将组件复制到正确的位置。这需要跟踪字符串的大小,这是一些额外的开销,或者两次扫描每个组件字符串的长度。

使用 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);
}

知道大小不是问题,不过我得看看strcpy如何工作。 - Tohkai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接