У меня есть QString, которую я хотел бы преобразовать в char *, а не QChar *, потому что я передам его в метод, который принимает char *, однако я не могу преобразовать его без получения const char *. Например я попробовал:
QString name = "name";
QByteArray byteArray = name.toUtf8();
myMailboxName = byteArray.constData();
а также
QString name = "name";
QByteArray byteArray = name.toUtf8();
myMailboxName = byteArray.data();
где myMailboxName — это личный символ * в моем классе. Однако я получаю сообщение об ошибке, потому что оно возвращает const char * и не может присвоить его char *. Как я могу это исправить?
Это потому, что data () возвращает адрес буфера в байтовом массиве, вы можете прочитать его, но, очевидно, вы не должны его записывать.
У вас есть свой собственный буфер вне байтового массива. Если вы хотите данные, вы должны скопировать буфер bytearray в myMailBoName.
использовать функцию memcpy
попробуйте этот фрагмент кода
const char *myMailboxName = name.toLatin1().data();
Используйте strdup. Это делает размещение и копию одновременно. Просто не забудьте освободить его, как только вы закончите.
Вы действительно можете использовать 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 аналогичный вопрос.
Я использую что-то вроде этой обертки:
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())
По крайней мере, это экономит немного печатать … 🙂
рассмотрим следующий примерQString str = "BlahBlah;"
попробуй этоchar* mychar = strdup(qPrintable(str));
или этоchar* mychr = str.toStdString().c_str();
или этоchar* mychar = strdup(str.ascii());
Каждый синтаксис работал на меня;)