C ++将std :: string转换为char

时间:2018-11-08 11:45:30

标签: c++ string char

我有以下情况:

struct MyStruct
{
  char name[25];
  char address[12];
}

Somewhere::SomeMethod(std::shared_ptr<SomeArgumentClass> args)
{
  // GetName() and GetAddress() both return std::strings
  ::MyStruct newValue = {args->GetName(), args->GetAddress()};
  // add newValue to some structure that needs to have chars
}

错误:

error C2440: 'initializing' : cannot convert from 'std::string' to 'char'
error C2440: 'initializing' : cannot convert from 'std::string' to 'char'

我无法将std :: string转换为char。

非常感谢!

1 个答案:

答案 0 :(得分:4)

首先,您的术语不正确。您不想转换为char,这是一个字符。我意识到该错误消息声称您正在尝试转换为char,但这是因为您的错误代码使编译器误以为您正在尝试初始化数组name的各个元素。当您编写错误的代码时,请警惕错误消息的具体内容,因为编译器无法理解您的想法-它只会超出您编写的内容!

实际上,您要将std::string中的字符复制到char数组中,即您的成员。

像这样:

Somewhere::SomeMethod(std::shared_ptr<SomeArgumentClass> args)
{
   const auto& name = args->GetName();
   const auto& address = args->GetAddress();

   ::MyStruct newValue;
   std::copy(std::begin(name), std::end(name), &newValue.name[0]);
   std::copy(std::begin(address), std::end(address), &newValue.address[0]);

   // add newValue to some structure that needs to have chars
}

但是您也需要添加边界检查。为此,大概我可以考虑将每个std::copy调用替换为以下内容:

std::copy_n(
   &name[0],
   std::min(name.size(), sizeof(newValue.name)),
   &newValue.name[0]
);

根据复制的字符数,您还需要一些空终止符。

尽管通常要注意的一点是您实际上需要复制这些字符,因为没有单步执行的方法。这部分是由于无法将数组分配给它,也源于它们的维是该类型的一部分,这使事情变得更加复杂。

如果这似乎使人痛苦不堪,那是因为-理想情况下,您应该坚持使用std::string,因为它要优越得多,并且专门为简化处理{{ 1}}。您仍然可以将指向字符串数据的char(或const char*!)传递到C API中。当然,如果char*本身是第三方C类型,则别无选择,只能艰难地做到这一点。