我可能错过了这个问题的微妙之处,因为我在互联网上找不到相关结果,而我认为这是一个常见问题。
无论如何,这是我的问题:
我有一个字符串数组,我希望将它连接成一个字符串,从char **到char *。
是否有任何可用于此目的的函数,或者我是否必须为新字符串分配内存,并在循环中使用strcat()以逐个连接数组中的所有字符串?
提前致谢!
答案 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);
}