Как преобразовать std :: string в const char * или char *?

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

[myDatePicker addTarget:self action:@selector(dateSelected:) forControlEvents:UIControlEventValueChanged];
847
задан Niall 6 October 2014 в 07:43
поделиться

2 ответа

Если Вы просто хотите передать std::string к функции, для которой нужно const char*, можно использовать

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

, Если Вы хотите получить перезаписываемую копию, как char *, можно сделать это с этим:

std::string str;
char * writable = new char[str.size() + 1];
std::copy(str.begin(), str.end(), writable);
writable[str.size()] = '\0'; // don't forget the terminating 0

// don't forget to free the string after finished using it
delete[] writable;

Редактирование : Заметьте, что вышеупомянутое не является безопасным исключением. Что-нибудь между эти new вызов и delete броски вызова, при утечке памяти поскольку ничто не призовет delete к Вам автоматически. Существует два непосредственных способа решить это.

повышение:: scoped_array

boost::scoped_array удалит память для Вас после выхода из объема:

std::string str;
boost::scoped_array<char> writable(new char[str.size() + 1]);
std::copy(str.begin(), str.end(), writable.get());
writable[str.size()] = '\0'; // don't forget the terminating 0

// get the char* using writable.get()

// memory is automatically freed if the smart pointer goes 
// out of scope

станд.:: вектор

Это - стандартный путь (не требует никакой внешней библиотеки). Вы используете std::vector , который полностью управляет памятью для Вас.

std::string str;
std::vector<char> writable(str.begin(), str.end());
writable.push_back('\0');

// get the char* using &writable[0] or &*writable.begin()
1007
ответ дан 7 revs, 4 users 92% 6 October 2014 в 07:43
поделиться

Используйте .c_str() метод для const char *.

можно использовать &mystring[0] для получения char * указатель, но существует несколько глюков: Вы не обязательно доберетесь, нуль завершил строку, и Вы не будете в состоянии изменить размер строки. Особенно необходимо бояться добавлять символы мимо конца строки, или Вы получите переполнение буфера (и вероятный катастрофический отказ).

не было никакой гарантии, что все символы будут частью того же непрерывного буфера до C++ 11, но на практике все известные реализации std::string проложили себе путь так или иначе; см. , Делает “& s [0] ” указывают на непрерывные символы в станд.:: строка? .

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

33
ответ дан Community 6 October 2014 в 07:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: