Как преобразовать QString в char*

У меня есть 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*. Как я могу это исправить?


person Amre    schedule 15.11.2012    source источник
comment
Не надо. Вам дается указатель на данные, которые вы не можете изменять, поэтому не назначайте их char*. Назначьте его char const*. Почему вы храните указатели в долгосрочной перспективе?   -  person Lightness Races in Orbit    schedule 16.11.2012
comment
@billz: Не совсем обман. Кажется, Амре нужен указатель на изменяемые символы, а не const char*   -  person David Rodríguez - dribeas    schedule 16.11.2012
comment
что значит дуп? значит. Я не могу использовать const char*, потому что у меня есть клиент класса, который выглядит так: class Client { public: Client(); void init(QString name); void sendMessage(QString mess); private: char *myMailboxName, buf[MSG_SIZE]; struct mq_attr attr; mqd_t mq_ownBox, mq_centralBox; }; я не знаю значение myMailboxName до запуска программы, и если бы я только что создал const char*, он вышел бы за пределы области действия после функции Я звоню с конца.   -  person Amre    schedule 16.11.2012
comment
@Amre dup = дублирование или тот же вопрос   -  person billz    schedule 16.11.2012


Ответы (6)


Это связано с тем, что data() возвращает адрес буфера в массиве байтов, его можно прочитать, но явно не следует записывать. У вас есть собственный буфер вне массива байтов. Если вам нужны данные, вы должны скопировать буфер bytearray в файл myMailBoName.

использовать функцию memcpy

person dzada    schedule 15.11.2012

попробуйте этот фрагмент кода

const char *myMailboxName = name.toLatin1().data();
person shivaranjani    schedule 28.11.2012
comment
Добро пожаловать в получение ваших первых 10 очков повторения. Пожалуйста, ознакомьтесь с тем, как использовать форматирование Markdown — это позволит выделить синтаксис кода в ваших ответах и ​​отобразить его моноширинным шрифтом. Рядом с текстовым полем ответа/вопроса есть '?' значок, который обеспечивает основы. - person marko; 28.11.2012
comment
Примечание: это, скорее всего, приведет к сбою программы, так как QByteArray, возвращаемый toLatin1(), исчезает в конце строки. Указатель, возвращаемый data(), ни на что не указывает. - person jomamaxx; 23.01.2021

Используйте стрдуп. Он выполняет выделение и копирование одновременно. Просто не забудьте освободить его, когда закончите.

person Mike    schedule 16.11.2012

Вы действительно можете использовать 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.

person tro    schedule 16.11.2012

Я использую что-то вроде этой оболочки:

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())

По крайней мере, это экономит немного ввода... :)

person Zeks    schedule 14.12.2012

рассмотрите следующий пример
QString str = "BlahBlah;"

попробуйте это
char* mychar = strdup(qPrintable(str));

или это
char* mychr = str.toStdString().c_str();

или это
char* mychar = strdup(str.ascii());

каждый синтаксис работал для меня;)

person Ani    schedule 18.04.2016