Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 2个字符串和返回的新指针的串联_C_String_Function_Pointers - Fatal编程技术网

C 2个字符串和返回的新指针的串联

C 2个字符串和返回的新指针的串联,c,string,function,pointers,C,String,Function,Pointers,我不确定我是否在做梦,因为我在任何地方都找不到这个函数。该函数向concat调用2个字符串,然后将指针返回到新分配的内存块,并融合这2个字符串 有人知道这样一个函数吗 你能想到的是的功能吗?这不是完全相同的事情:它需要一个以NULL结尾的字符串列表,而不仅仅是两个字符串 在libc中没有一个标准函数可以将字符串连接到一个新分配的字符串中。您是否可以考虑使用的函数?这不是完全相同的事情:它需要一个以NULL结尾的字符串列表,而不仅仅是两个字符串 在libc中没有将字符串连接到新分配字符串的标准函数

我不确定我是否在做梦,因为我在任何地方都找不到这个函数。该函数向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表示。