复制/连接动态分配的C风格字符串
Copy/concatenate dynamically allocated C style strings
我试图写一个函数来连接两个动态分配的c风格字符串。我在设计中是否正确,您首先必须将目的地复制到临时char[]
,删除原始内存分配,获得两个char[]
的长度,用新长度分配新内存,然后将字符复制到dest[]
?
所以伪代码:
void concat(char* dest, char *source)
{
char temp = dest;
delete [] dest;
char dest = new char [new size];
copy temp to dest;
copy source to dest;
}
我是否从根本上误解了这一点?
不要删除dest
,因为它可能指向非动态内存。然后使用strcat
,或者更安全的strncat
。
如果源和目标重叠,则必须复制到临时缓冲区,如果不重叠则不复制。对于C char*
,这种情况可能会发生,并且您可能会将mycat(str+2, str)
作为测试用例。
您的concat()原型为:
void concat(char* dest, char *source);
因此,concat()函数内部的新"dest"分配不会反映在调用函数上。
两种可能的解决方案:
调用者函数应该用新的长度重新分配"dest",然后传递给concat()。在这种情况下,concat()不会执行重新分配。
如果允许concat()执行重新分配,那么,它的原型应该更改为:
a)
void concat(char** dest, char *source);
-> strcat/strncat可以按照Jonathan Leffler的建议在这种情况下使用b)
char* concat(char* dest, char *source);
->在这种情况下需要返回新分配的"dest"
相关文章:
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 如何用符合C++核心准则的代码替换C风格的字符串解析
- 如何按照 Google C++风格指南连接字符串文字?
- 将STD :: U8String复制到一个UTF8字符的C风格字符串中
- NULLPTR用于终止C风格的字符串
- 在班级中使用动态分配的C风格字符串,并带有复制和分配操作员,给出了意外的结果
- 使用PINVOKE编组LPWSTR的C风格数组,以托管字符串[]
- 无法将C风格的字符串推送到std::vector中
- 比较两个C风格字符串的正确函数是什么
- Perl风格的引号用于C++中的长字符串
- 对于c风格字符串,boost::spirit::qi和qi::alnum会导致模板编译错误
- c++中的C风格字符串和操作符重载
- 复制/连接动态分配的C风格字符串
- 基本的c风格字符串内存分配
- 如何判断c++模板类型是否为C风格字符串
- 将字符串转换为c风格字符串并检测空终止字符
- 使用c风格字符串字面值与构造未命名std::string对象的默认建议
- 从函数返回一个动态的C风格字符串
- 使用使用C风格字符串作为OUT参数的WinAPI函数
- 将c风格字符串传递给c++函数