C 2个字符串和返回的新指针的串联
我不确定我是否在做梦,因为我在任何地方都找不到这个函数。该函数向concat调用2个字符串,然后将指针返回到新分配的内存块,并融合这2个字符串 有人知道这样一个函数吗 你能想到的是的功能吗?这不是完全相同的事情:它需要一个以NULL结尾的字符串列表,而不仅仅是两个字符串 在libc中没有一个标准函数可以将字符串连接到一个新分配的字符串中。您是否可以考虑使用的函数?这不是完全相同的事情:它需要一个以NULL结尾的字符串列表,而不仅仅是两个字符串 在libc中没有将字符串连接到新分配字符串的标准函数。检查此问题: 此外,如果您有能力提供额外的依赖项,还提供了许多处理字符串的函数。检查此问题:C 2个字符串和返回的新指针的串联,c,string,function,pointers,C,String,Function,Pointers,我不确定我是否在做梦,因为我在任何地方都找不到这个函数。该函数向concat调用2个字符串,然后将指针返回到新分配的内存块,并融合这2个字符串 有人知道这样一个函数吗 你能想到的是的功能吗?这不是完全相同的事情:它需要一个以NULL结尾的字符串列表,而不仅仅是两个字符串 在libc中没有一个标准函数可以将字符串连接到一个新分配的字符串中。您是否可以考虑使用的函数?这不是完全相同的事情:它需要一个以NULL结尾的字符串列表,而不仅仅是两个字符串 在libc中没有将字符串连接到新分配字符串的标准函数
另外,如果你能负担得起额外的依赖性,它还提供了很多函数来处理字符串。我不知道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;
}
我不知道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;
}
我不知道是否有现成的,但这个经过简单测试的实现如何:
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;
}
我不知道是否有现成的,但这个经过简单测试的实现如何:
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;
}
是的,这看起来越来越像一场梦。我不能保证没有这样的功能;例如,gnulibc和FreeBSD libc都包含各种非标准函数,尽管我不记得它们都有您想要的确切函数。另一方面,它很容易实现为define strdupcata,bg_strcondata,b,NULL。是的,这看起来越来越像一场梦。我不保证没有这样的函数;例如,gnulibc和FreeBSD libc都包含各种非标准函数,尽管我不记得它们都有您想要的确切函数。另一方面,它很容易实现为define strdupcata,b g_strcondata,b,NULL。如果保存strlens1的返回值,可以避免strcat中的隐式strlen。@Matteo:OK。FWIW现在在复制数据时,甚至没有对字符串结尾进行隐式检查。如果保存strlens1的返回值,可以避免strcat中的隐式strlen。@Matteo:OK。FWIW现在,在复制数据时,甚至没有对字符串结尾进行隐式检查。strdup的扭曲内存可能只是我的问题。如果第一个和第二个指向重叠内存,则可能是s1+s2+1溢出。当然,在尺寸小于void*的假拱门上。最好检查一下@R:这是一种非常不可能的情况,你必须有一个大于地址空间一半的字符串,但在理论上这是可能的,而且这是一个几乎不花费任何费用的检查,所以我添加了它;请注意,s2+1不能溢出,因为第二个数组的实际大小是s2+1,因为末尾的\0,并且C中的每个对象大小都保证可以用大小\u t表示。strdup的扭曲内存可能只是我的问题。如果第一个和第二个指向重叠内存,则s1+s2+1可能溢出。当然,在尺寸小于void*的假拱门上。最好检查一下@R:这是一种非常不可能的情况,你必须有一个大于地址空间一半的字符串,但在理论上这是可能的,而且这是一个几乎不花费任何费用的检查,所以我添加了它;请注意,s2+1不能溢出,因为第二个数组的实际大小是s2+1,因为结尾是\0,并且C中的每个对象大小都保证可以用大小\u t表示。