来自c_str的C ++ memcpy到char *

时间:2013-07-11 06:43:34

标签: c++ string char memcpy

我已经做了一些基本的阅读,并从我收集到的内容.c_str()始终有一个空终止符。

我有一个相当简单的C ++程序:

int main(int argc, char** argv)
{
  std::string from = "hello";
  char to[20];
  memcpy(to, from.c_str(), strlen(from.c_str())+1);
  std::cout<< to << std::endl;
  return 0;
}

memcpy是否会确保我将以空字符结尾的字符串复制到我的变量中(假设我的字符串来自长度较短)?

4 个答案:

答案 0 :(得分:4)

您应该使用std::string复制字符串。但是,如果你想这样做,你应该使用strcpy而不是memcpy

int main(int argc, char** argv)
{
  std::string from = "hello";
  char to[20];
  strcpy(to, from.c_str());
  std::cout<< to << std::endl;
  return 0;
}

答案 1 :(得分:3)

memcpy不知道字符串是什么。你给它一个范围来复制。这取决于strlen这里提供范围的终止点

答案 2 :(得分:2)

是的,只要from中的字符串短于20,这就会起作用。哦,不,等等,我们也在复制NULL终结符,所以它必须短于19.我猜你看到了这会导致一些混乱。

顺便说一下这个代码很危险的原因:我假设这是演示代码,你的实际代码将从某种输入中获取该字符串。那一刻你将无法控制它的持续时间。您可以截断它,但您可能忘记这样做,这意味着您的程序将内容复制到可能不属于它的内存。这可能会导致崩溃,但至少会导致未定义的行为,因为您覆盖了可能包含其他重要数据的内存。

使用string类实际上有助于避免此类问题,而无需指定字符串长度。我建议使用这个类,只在绝对必要时才进行涉及c_str()的操作。

答案 3 :(得分:0)

您的问题的答案是“是”(只要您的char数组足够大,您应该进行验证步骤。)

如果你真的想这样做,你可以这样做:

int main(int argc, char** argv)
{
  std::string from = "hello";
  char* to = new char[from.length() + 1];
  memcpy(to, from.c_str(), from.length() + 1 );
  std::cout<< to << std::endl;
  delete[] to;
  return 0;
}

只要您不将另一个较长的字符串写入“to”

,哪个更安全