我试图通过以下方法将 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();
}
所以也许你还有其他问题。这到底是怎么回事?
也许
my_qstring.toStdString().c_str();
或者更安全,正如 Federico 指出的那样:
std::string str = my_qstring.toStdString();
const char* p = str.c_str();
它远非最佳,但会完成工作。
toStdString()
返回一个新的 std::string
对象,然后获得指向内部数据 const char *
的指针。但是,该字符串对象在此语句之后立即被销毁,因此如果您在后续语句中使用它,结果指针可能没有有效地址。
toStdString()
;这是使用原始指针。或者,更具体地说,使用来自其作用域还没有被很好理解的对象的原始指针。
f(qstr.toStdString().c_str())
是可以的(延长到 f
结束)。但是,从 C++17 开始,a.b
的评估顺序仅保证在 b
之前是 a
。我想大多数实现在实践中已经可以这样工作了,但严格来说我相信它会是 C++17 之前的 UB
将 QString 转换为 char* 的最简单方法是 qPrintable(const QString& str),它是扩展为 str.toLocal8Bit().constData()
的宏。
qPrintable
返回 const char*
而不是 char*
,str.toLocal8Bit().data()
返回 char*
。 2) 一旦您在使用 qPrintable
的语句中点击分号,指向 const char*
的指针就会变为无效。所以 const char* c_ptr = s.toLocal8Bit().constData();
没有任何意义。
qPrintable
输出是否保证为零终止?
qPrintable()
描述中警告的那样:“在使用 qPrintable() 的语句之后,char 指针将无效。”
如果您仅将 David 的答案用于输出到文件或在屏幕上显示,那么 David 的答案可以正常工作,但如果函数或库需要 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 字符,这会导致未定义的数据。这取决于您所说的“它似乎不起作用”的意思。
如果您的字符串包含非 ASCII 字符 - 最好这样做:s.toUtf8().data()
(或 s->toUtf8().data()
)
正确的解决方案是这样的
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<<"<---";
Qt 提供了最简单的 API
const char *qPrintable(const QString &str)
const char *qUtf8Printable(const QString &str)
如果您想要非常量数据指针,请使用
str.toLocal8Bit().data()
str.toUtf8().data()
使用 std::vector 作为中间容器是一种可行的方法:
QString dataSrc("FooBar");
QString databa = dataSrc.toUtf8();
std::vector<char> data(databa.begin(), databa.end());
char* pDataChar = data.data();
不定期副业成功案例分享
const char*
和char*
不是同一类型。const char*
是真正可以获得的。用户可以自由地将数据复制到可写缓冲区。char*
而不是char const*
,您的回答只是忽略了这个事实而没有提及。toLocal8Bit()
?