У меня есть QString, которую я хотел бы преобразовать в char*, а не в QChar*, потому что я буду передавать ее в метод, который принимает char*, однако я не могу преобразовать ее, не получив константную char*. Например, я пробовал:
QString name = "name";
QByteArray byteArray = name.toUtf8();
myMailboxName = byteArray.constData();
и
QString name = "name";
QByteArray byteArray = name.toUtf8();
myMailboxName = byteArray.data();
где myMailboxName - частный char* в моем классе. Однако я получаю сообщение об ошибке, потому что он возвращает const char* и не может присвоить его char*. Как я могу это исправить?
Ответ 1 · рейтинг 3 · dzada
Это связано с тем, что data() возвращает адрес буфера в массиве байтов, его можно прочитать, но явно не следует записывать. У вас есть собственный буфер вне массива байтов. Если вам нужны данные, вы должны скопировать буфер bytearray в файл myMailBoName.
использовать функцию memcpy
Ответ 4 · рейтинг 1 · tro
Вы действительно можете использовать strdup (вопрос stackoverflow об этом), поскольку Майк рекомендует, но также вы можете сделать это:
// copy QString to char*
QString filename = "C:\dev\file.xml";
char* cstr;
string fname = filename.toStdString();
cstr = new char [fname.size()+1];
strcpy( cstr, fname.c_str() );
Получил: похожий вопрос stackoverflow.
Ответ 5 · Zeks
Я использую что-то вроде этой оболочки:
template<typename T, typename Y>
void CharPasser(std::function<T(char *)> funcToExecute, const Y& str)
{
char* c = 0;
c = qstrdup(c, str.c_str());
funcToExecute(c);
delete[] c;
}
int SomeFunc(char* ){}
затем используйте его как:
CharPasser<int, std::string>(SomeFunc, QString("test").tostdString())
По крайней мере, это экономит немного ввода... :)