静态复制可变长度的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;
}