你不能这样做,你会返回一个指向一个函数返回后不再有效的本地数组的指针,此外,你不会检查缓冲区溢出.
这是一个分配内存的快速脏版本:
#include#include char *concatenate(const char *a, const char *b, const char *c) { return strcat(strcat(strcpy(malloc(strlen(a) + strlen(b) + strlen(c) + 1, a), b), c); }
这是一个使用memcpy
和测试malloc
失败的更精细的版本:
#include#include char *concatenate(const char *a, const char *b, const char *c) { size_t alen = strlen(a); size_t blen = strlen(b); size_t clen = strlen(c); char *res = malloc(alen + blen + clen + 1); if (res) { memcpy(res, a, alen); memcpy(res + alen, b, blen); memcpy(res + alen + blen, c, clen + 1); } return res; }
它应该是更有效,因为它不执行额外的扫描strcpy
和strcat
做的,但只有细心的标杆可以证明,如果它是在上面的简单版本,真正的改善.
如果需要将3个字符串连接到现有缓冲区,一个非常简单的解决方案是:
char dest[DEST_SIZE]; snprintf(dest, sizeof dest, "%s%s%s", a, b, d);
你的str是你的功能的本地.
你可以在你的连接字符串中添加第四个参数,或者你可以在函数内部进行malloc,只需确保在使用后释放它.
char *concatenate(char *a, char *b, char *c) { int size = strlen(a) + strlen(b) + strlen(c) + 1; char *str = malloc(size); strcpy (str, a); strcat (str, b); strcat (str, c); return str; } int main(void) { char *str = concatenate("bla", "ble", "bli"); printf("%s", str); free(str); return 0; }