静态复制可变长度的C字符串

静态复制可变长度的C字符串,c,copy,c-strings,C,Copy,C Strings,假设我有函数foo,其中我希望创建input\u str内容的深度副本,并将其存储在指针temp\u cpy中。是否有任何C字符串函数可以在不向temp\u cpy动态分配内存的情况下执行此操作 void foo(const char *input_str) { char *temp_cpy = NULL; } 我不想简单地设置temp\u cpy=input\u str,因为temp\u cpy将在函数中修改,但input\u str应保持不变 谢谢。您必须在某处为字符串副本的内容留

假设我有函数
foo
,其中我希望创建
input\u str
内容的深度副本,并将其存储在指针
temp\u cpy
中。是否有任何C字符串函数可以在不向
temp\u cpy
动态分配内存的情况下执行此操作

void foo(const char *input_str)
{
    char *temp_cpy = NULL;
}
我不想简单地设置
temp\u cpy=input\u str
,因为
temp\u cpy
将在函数中修改,但
input\u str
应保持不变


谢谢。

您必须在某处为字符串副本的内容留出存储空间。没有神奇的方法可以复制不需要额外存储的东西

但是,这可以在堆栈上,就像在堆上一样,使用

并可用于实现这一点:

void foo(const char *input_str)
{
    char temp[strlen(input_str) + 1];
    strcpy(temp, str);
    /* ... */
}
如果您的平台不支持VLAs,则必须使用堆内存。该功能通常可用。如果不是,则可以轻松地使用复制。当你完成它时,你必须记住这段记忆

void foo(const char *input_str)
{
    char *temp = strdup(input_str);
    /* ... */
    free(temp);
}

如果您的平台不支持VLA,并且由于某种原因确实无法使用堆,那么剩下的唯一选项就是预定最大长度的缓冲区。这是一种特殊情况,如果可能的话,应该避免,因为它会产生额外的限制,您必须跟踪

#define MAX_FOO_BUFSZ 255

void foo(const char *input_str)
{                         
    char buffer[MAX_FOO_BUFSZ + 1] = { 0 };
    strncpy(buffer, input_str, MAX_FOO_BUFSZ);    
    
    /* ... */
} 

您还可以使用
strdup
函数(它是POSIX,但大多数实现都支持它)


记住在不需要时释放分配的内存。

应该注意的是,并非所有编译器都支持VLA(看看Microsoft)。
#define MAX_FOO_BUFSZ 255

void foo(const char *input_str)
{                         
    char buffer[MAX_FOO_BUFSZ + 1] = { 0 };
    strncpy(buffer, input_str, MAX_FOO_BUFSZ);    
    
    /* ... */
} 
char *foo(const char *input_str)
{
    char *temp = strdup(input_str);
    if(temp)
    {
        // do some stuff
    }
    return temp;
}