char *上的memset的C ++等价物

时间:2010-01-24 22:26:25

标签: c++ memcpy memset

我有这段代码

  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。

有谁知道吗?谢谢。

7 个答案:

答案 0 :(得分:10)

一般来说,有std::fillhttp://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');

memsetmemcpy仍然存在,但可以在适当的时候使用。从许多C ++开发人员的角度来看,使用原始new而不使用资源管理对象可能是一个更大的禁忌。使用std::stringstd::vector<char>要好得多,以便内存释放是自动的,代码更安全。

答案 2 :(得分:2)

  

我理解使用memcpy和memset是不行的,但是我还没有完全理解如何在C ++中使用它,最好没有std。

当使用memcpymemset时,使用std::copychar*并非禁忌。为什么会这样?

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 ++没有注释。