【发布时间】:2011-07-10 23:15:58
【问题描述】:
我不确定我是不是在做梦,因为我在任何地方都找不到这个功能。该函数调用 2 个字符串进行连接,然后将指针返回到一个新分配的内存块,其中 2 个字符串融合在一起。
有人知道这样的功能吗?
【问题讨论】:
标签: c string function pointers
我不确定我是不是在做梦,因为我在任何地方都找不到这个功能。该函数调用 2 个字符串进行连接,然后将指针返回到一个新分配的内存块,其中 2 个字符串融合在一起。
有人知道这样的功能吗?
【问题讨论】:
标签: c string function pointers
我不知道 C 标准中有类似的东西; POSIX C 包含 strdup ,它返回所提供字符串的新分配副本,但这不是您要问的。
不过,您可以轻松地自己构建它:
char * strcat_alloc(const char * first, const char * second)
{
size_t s1=strlen(first), s2=strlen(second), stot=s1+s2+1;
// Length overflow check (see @R.. comment)
if(stot<s2+1)
return NULL;
char * ret = malloc(stot);
if(ret==NULL)
return NULL;
strcpy(ret,first);
strcpy(ret+s1, second);
return ret;
}
【讨论】:
first 和second 指向重叠的内存,s1+s2+1 可能会溢出。当然,在size_t 小于void * 的虚假拱门上。检查可能是明智的。 :)
s2+1 不能溢出,因为second 中数组的实际大小是s2+1(因为末尾有\0),并且C 中的每个对象大小都保证可以由size_t 表示.
你能想到GLib 的g_strconcat() 函数吗?它完全不是一回事:它需要一个以NULL 结尾的字符串列表,而不仅仅是两个字符串。
在libc 中没有将字符串连接成新分配的字符串的标准函数。
【讨论】:
#define strdupcat(a, b) g_strconcat(a, b, NULL)。
检查这个问题:Using strcat in C
另外,glib 提供了很多处理字符串的函数,如果你能承受额外的依赖的话。
【讨论】:
我不知道有现成的,但是这个经过轻微测试的实现怎么样:
char* strdup_cat( char const* s1, char const* s2)
{
size_t siz1 = strlen(s1);
size_t siz2 = strlen(s2);
char* result = (char*) malloc(siz1 + siz2 + 1);
if (result) {
memcpy( result, s1, siz1);
memcpy( result + siz1, s2, siz2 + 1);
}
return result;
}
【讨论】:
strlen(s1)的返回值,你可以避免strcat中隐含的strlen。