C ++ конвертировать std :: string в char - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть следующий сценарий:

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 в символ.

Большое спасибо!

1 Ответ

0 голосов
/ 08 ноября 2018

Во-первых, ваша терминология неверна. Вы не хотите конвертировать в char, который является одним символом. Я понимаю, что в сообщении об ошибке утверждается, что вы пытаетесь преобразовать в char, но это потому, что ваш неверный код сбил с толку компилятор, заставляя его думать, что вы пытаетесь инициализировать отдельные элементы массива name. Будьте осторожны с особенностями сообщения об ошибке, когда пишете неправильный код, потому что компилятор не может прочитать ваши мысли & mdash; это может только уйти от того, что вы написали!

На самом деле вы хотите скопировать символы внутри вашего 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]
);

Вам также потребуется некоторое нулевое завершение в зависимости от того, сколько символов было скопировано.

В целом, хотя существенным моментом является то, что вам действительно нужно скопировать эти символы, потому что нет одношагового способа сделать это. Отчасти это связано с тем, что массивы нельзя назначать, а также с тем фактом, что их размеры являются частью типа, что усложняет задачу.

Если это похоже на боль в заднице, это потому, что это & ​​mdash; в идеале вы должны придерживаться std::string по всем направлениям, потому что он намного лучше и специально разработан для облегчения работы с массивами char. Вы все еще можете передать const char* (или char*!), Указывающий на данные строки, в C API. Конечно, если ::MyStruct сам по себе является сторонним C-типом, у вас нет другого выбора, кроме как сделать это трудным путем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...