C++ memcpy to char* from c_str

C++ memcpy to char* from c_str

本文关键字:str from memcpy to char C++      更新时间:2023-10-16

我已经做了一些基本的阅读,从我收集到的内容来看。c_str()总是有一个null终止符。

我有一个相当简单的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会确保我将一个以null结尾的字符串复制到我的变量to(前提是我的字符串from的长度更短)吗?

您应该使用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;
}

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

是的,只要from中的字符串短于20,这就可以工作。哦,不,等等,我们也在复制NULL终止符,所以它必须短于19。我想你知道这会导致一些混乱。

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

使用string类实际上有助于避免此类问题,因为不必指定字符串长度。我建议使用这个类,并且只在绝对必要的时候执行涉及c_str()的操作。

您的问题的答案是"是";(只要您的char数组足够大,就应该执行验证步骤)。

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

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

只要你不把另一个更长的字符串写进";至";