8

我有这个代码

  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。

有人知道吗?谢谢你。

4

7 回答 7

12

一般来说,有std::fill. http://www.cplusplus.com/reference/algorithm/fill/

或者在这种特殊情况下,您应该考虑使用std::vector<char>.

(请注意,memset如果你使用 ,它仍然可以在 C++ 中使用#include <cstring>,尽管它在 C++ 中不那么惯用。)

于 2010-01-24T22:31:30.537 回答
11

当您拥有一组对象类型时,一种可能的替代方法memset是使用该std::fill算法。它适用于迭代器范围以及指向数组的指针。

memcpy调用通常可以替换为对 的调用std::copy

例如

std::copy(name, name + strlen(name) + 1, oldname);
// ...
std::fill(name, name + strlen(name), '\0');

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

于 2010-01-24T22:29:46.673 回答
2

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

这不是禁止使用memcpy以及memset何时使用它们。为什么应该这样?

std::copyC++ 中有将一组项目(适用于任何类型,而不仅仅是char*)从一个迭代器复制到另一个。

于 2010-01-24T22:31:40.313 回答
2

除了必须手动复制和自己进行所有内存分配的不便之外,该 C++ 代码没有任何问题。

但是,我强烈鼓励std::string在 C++ 中使用 for 字符串操作。

于 2010-01-24T22:32:41.827 回答
1

如果您只是在进行字符串操作,请使用 string.

于 2010-01-24T22:30:20.457 回答
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";

没有什么可以阻止您使用strxxxC++ 中的函数系列,但我强烈建议您切换到std::stringSTL 和其余部分。它也不是完美的,但更不容易出错。

于 2010-01-24T22:33:15.137 回答
-3
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++ 未注释。

于 2010-01-25T19:28:39.813 回答