没有标准库函数可以做到这一点。
最有效的解决方案是计算连接后字符串的大小,然后将组件复制到正确的位置。这需要跟踪字符串的大小,这是一些额外的开销,或者两次扫描每个组件字符串的长度。
使用 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);
}
}
char* join(char** in, size_t inlen) {
return join_helper(in, inlen, 0, 0);
}
asprintf(3)
函数,它为您分配目标字符串,您可以使用asprintf(&concat, "%s%s%s", s[0], s[1], s[2])
来节省一些工作量,但它是非标准的。 :) - Ulfalizer