Как преобразовать 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)


arrow_upward
3
arrow_downward

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

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

person dzada    schedule 15.11.2012

arrow_upward
2
arrow_downward

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

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

arrow_upward
1
arrow_downward

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

person Mike    schedule 16.11.2012

arrow_upward
1
arrow_downward

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

arrow_upward
0
arrow_downward

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

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

arrow_upward
0
arrow_downward

рассмотрите следующий пример
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