Я пытался преобразовать QString в тип char * следующими методами, но они, похоже, не работают.
//QLineEdit *line=new QLineEdit();{just to describe what is line here}
QString temp=line->text();
char *str=(char *)malloc(10);
QByteArray ba=temp.toLatin1();
strcpy(str,ba.data());
Можете ли вы уточнить возможные недостатки этого метода или предложить альтернативный метод?
QString s("some"); printf(reinterpret_cast<char *>(s.data()));
Ответы:
Что ж, Qt FAQ говорит:
int main(int argc, char **argv) { QApplication app(argc, argv); QString str1 = "Test"; QByteArray ba = str1.toLocal8Bit(); const char *c_str2 = ba.data(); printf("str2: %s", c_str2); return app.exec(); }
Так что, возможно, у вас другие проблемы. Как именно это не работает?
источник
const char*
иchar*
не одного типа.const char*
это то, что действительно можно получить. Пользователь может копировать данные в буфер с возможностью записи.char*
, а неchar const*
, и ваш ответ просто игнорирует этот факт без упоминания.toLocal8Bit()
?Может быть
my_qstring.toStdString().c_str();
или безопаснее, как отмечает Федерико:
std::string str = my_qstring.toStdString(); const char* p = str.c_str();
Это далеко не оптимально, но сработает.
источник
toStdString()
вернуть новыйstd::string
объект, и тогдаconst char *
будет получен указатель на внутренние данные . Однако строковый объект сразу же уничтожается после этого оператора, поэтому указатель результата, вероятно, не имеет действительного адреса, если вы используете его в следующем операторе.toStdString()
который опасен; это использование необработанных указателей. Или, более конкретно, использование необработанных указателей от объектов, область действия которых не совсем понятна.Самый простой способ преобразовать QString в char * - это qPrintable (const QString & str) , который является макросом, расширяющимся до
str.toLocal8Bit().constData()
.источник
qPrintable
возвращаетconst char*
неchar*
,str.toLocal8Bit().data()
возвращаетсяchar*
. 2) Указатель наconst char*
становится недействительным, как только вы ставите точку с запятой в операторе, гдеqPrintable
был использован. Такconst char* c_ptr = s.toLocal8Bit().constData();
что смысла нет.qPrintable
Гарантируется ли вывод, что нулевое завершение?qPrintable()
описании: «Указатель char будет недействительным после оператора, в котором используется qPrintable ()».Ответ Дэвида работает нормально, если вы используете его только для вывода в файл или отображения на экране, но если функция или библиотека требует char * для синтаксического анализа, то этот метод работает лучше всего:
// 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() ); // function that requires a char* parameter parseXML(cstr);
источник
ИЗМЕНЕНО
этот способ тоже работает
QString str ("Something"); char* ch = str.toStdString().C_str();
источник
std::string
→QString
), а не на то, о чем просили.Ваша строка может содержать символы, отличные от Latin1, что приводит к неопределенным данным. Это зависит от того, что вы подразумеваете под «похоже, это не работает».
источник
Правильное решение будет таким
QString k; k = "CRAZYYYQT"; char ab[16]; sprintf(ab,"%s",(const char *)((QByteArray)(k.toLatin1()).data()) ); sprintf(ab,"%s",(const char *)((QByteArray)(k.toStdString()).data())); sprintf(ab,"%s",(const char *)k.toStdString().c_str() ); qDebug()<<"--->"<<ab<<"<---";
источник
Если ваша строка содержит символы, отличные от ASCII - лучше сделать это так:
s.toUtf8().data()
(илиs->toUtf8().data()
)источник
Это жизнеспособный способ использовать std :: vector в качестве промежуточного контейнера:
QString dataSrc("FooBar"); QString databa = dataSrc.toUtf8(); std::vector<char> data(databa.begin(), databa.end()); char* pDataChar = data.data();
источник
Qt предоставляет простейший API
const char *qPrintable(const QString &str) const char *qUtf8Printable(const QString &str)
Если вы хотите использовать неконстантный указатель данных
источник