std::string to char*

Я хочу перетворити std::string в **char* або char[]** тип даних.

std::string str = "string";
char* chr = str;

Наслідки: "error: cannot convert 'std::string' to 'char' ... ".

Якими методами це можна зробити?

Рішення

Автоматично він не перетвориться (слава Богу). Вам доведеться використовувати метод c_str(), щоб отримати версію рядка на мові C.

std::string str = "string";
const char *cstr = str.c_str();

Зверніть увагу, що він повертає const char *; вам не дозволяється змінювати рядок у стилі C, який повертає c_str(). Якщо ви хочете обробити його, вам доведеться спочатку скопіювати його:

std::string str = "string";
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
// do stuff
delete [] cstr;

Або у сучасній C++:

std::vector cstr(str.c_str(), str.c_str() + str.size() + 1);
Коментарі (18)
  • Якщо вам потрібен просто рядок у стилі C, що представляє той самий вміст:

      char const* ca = str.c_str();
  • Якщо потрібно отримати рядок у стилі C з новим вмістом, то одним із способів (враховуючи, що розмір рядка невідомий під час компіляції) є динамічне виділення:

      char* ca = new char[str.size()+1];
      std::copy(str.begin(), str.end(), ca);
      ca[str.size()] = '\0';

    Не забудьте потім його видалити.

  • Якщо вам потрібен статично виділений масив обмеженої довжини:

      size_t const MAX = 80; // максимальна кількість символів
      char ca[MAX] = {};
      std::copy(str.begin(), (str.size() >= MAX ? str.begin() + MAX : str.end()), ca);

std::string неявно не перетворюється до цих типів з тієї простої причини, що потреба в цьому, як правило, є запахом дизайну. Переконайтесь, що вам це дійсно потрібно.

Якщо вам визначено потрібен символ*, то це, мабуть, найкращий спосіб:

vector v(str.begin(), str.end());
char* ca = &v[0]; // pointer to start of vector
Коментарі (15)

Припустимо, що вам просто потрібно передати рядок у стилі C на вхід:

std::string str = "string";
const char* chr = str.c_str();
Коментарі (0)