我有这段代码
char * oldname = new char[strlen(name) + 1];
memcpy(oldname,name,strlen(name) + 1);
name = new char[strlen(oldname) + strlen(r.name) + 1];
memset(name, '\0', strlen(name));
strcat(name,oldname);
strcat(name," ");
strcat(name,r.name);
我理解使用memcpy和memset是不行的,但是我还没有完全理解如何在C ++中使用它,最好没有std。
有谁知道吗?谢谢。
答案 0 :(得分:10)
一般来说,有std::fill
。 http://www.cplusplus.com/reference/algorithm/fill/
或者在此特定情况下,您应该考虑使用std::vector<char>
。
(请注意,如果使用memset
,#include <cstring>
仍然可以在C ++中使用,尽管它在C ++中不那么惯用。)
答案 1 :(得分:9)
当您拥有一组对象类型时,memset
的一个可能替代是使用std::fill
算法。它适用于迭代器范围以及指向数组的指针。
memcpy
来替换 std::copy
次来电。
e.g。
std::copy(name, name + strlen(name) + 1, oldname);
// ...
std::fill(name, name + strlen(name), '\0');
memset
和memcpy
仍然存在,但可以在适当的时候使用。从许多C ++开发人员的角度来看,使用原始new
而不使用资源管理对象可能是一个更大的禁忌。使用std::string
或std::vector<char>
要好得多,以便内存释放是自动的,代码更安全。
答案 2 :(得分:2)
我理解使用memcpy和memset是不行的,但是我还没有完全理解如何在C ++中使用它,最好没有std。
当使用memcpy
和memset
时,使用std::copy
和char*
并非禁忌。为什么会这样?
C ++中有{{1}}将一组项(从任何类型工作,而不仅仅是{{1}})从迭代器复制到另一个。
答案 3 :(得分:2)
除了手动复制和自己完成所有内存分配的不便之外,C ++代码没有任何问题。
但是,我强烈建议在C ++中使用std::string
进行字符串操作。
答案 4 :(得分:1)
如果您只是在进行字符串操作,请使用字符串。
答案 5 :(得分:1)
要从a复制到b,请将std::copy(src_start,src_end,dest_start)
递增src_start
并将其复制到下一个目标元素,直到满足src_start==src_end
。
memcpy(oldname,name,strlen(name)+1)
// is the same as
std::copy(name,name+strlen(name)+1,oldname)
..除了它也适用于非POD,如果一个元素超过一个字节,你不需要乱用字节长度。
但是,如果您只想进行字符串操作,则会提供std::string
类(以及宽字符串的std::wstring
)。连接它们就像:
std::string s = "name",s2 = ..,s3 = ..;
s = s2+s+s3+"Hello";
没有什么能阻止你在C ++中使用strxxx
系列函数,但我强烈建议你切换到std::string
和STL的其余部分。它也不完美,但更不容易出错。
答案 6 :(得分:-1)
char * oldname = new char[strlen(name) + 1];
//memcpy(oldname,name,strlen(name) + 1);
strcpy(oldname,name);
name = new char[strlen(oldname) + strlen(r.name) + 1];
//memset(name, '\0', strlen(name));
name[0] = '\0';
strcat(name,oldname);
strcat(name," ");
strcat(name,r.name);
我现在明白这一点,只是想为将来的访问者粘贴此代码 注释行与它们下面的未注释行相同。 C评论说,C ++没有注释。