2010-03-26 127 views
59

我试图通过以下方法将QString转换为char *类型,但它们似乎不起作用。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()); 

你能否详细说明可能的缺陷用此方法,或者给一个替代方法是什么?

+0

你的榜样正常工作对我来说,问题出在哪里? – Viesturs 2010-03-26 14:05:25

+2

对不起我的英文,但为什么它不正确使用这种方法? 'QString s(“some”); printf(reinterpret_cast (s.data()));' – 2012-07-07 14:27:17

回答

75

好了,Qt FAQ说:

int main(int argc, char **argv) 
{ 
QApplication app(argc, argv); 
QString str1 = "Test"; 
QByteArray ba = str1.toLatin1(); 
const char *c_str2 = ba.data(); 
printf("str2: %s", c_str2); 
return app.exec(); 
} 

因此,也许你有其他问题。这究竟是不是工作?

+8

'const char *'和'char *'不是同一类型。 – 2012-11-15 22:12:32

+2

@LightnessRacesinOrbit:在没有它的情况下写入QString的内容是一个可怕的想法,因此'const char *'当然是真正可以获得的。用户可以自由将数据复制到可写缓冲区。 – 2012-11-16 14:28:04

+1

我完全同意。然而,关于'char *'而不是'char const *'问的问题,你的回答只是忽略了这个事实而没有提及。 – 2012-11-16 16:48:34

1

您的字符串可能包含非Latin1字符,这会导致未定义的数据。这取决于你的意思是“它似乎没有工作”。

32

也许

my_qstring.toStdString().c_str();

或更安全,因为费德里科指出:

std::string str = my_qstring.toStdString(); 
const char* p = str.c_str(); 

这是远不够理想,但会做的工作。

+3

这将搞乱Unicode字符。一个Unicode友好的解决方案:http://stackoverflow.com/a/4644922/238387 – jlstrecker 2012-09-18 19:35:13

+9

这个方法是非常危险的,不应该使用:'toStdString()'返回一个新的'std :: string'对象,然后指针到内部数据'const char *'被获得。但是,在此语句之后,字符串对象会立即销毁,因此如果在后续语句中使用它,结果指针可能没有有效地址。 – RicoRico 2016-03-06 12:32:05

6

如果你只使用它输出到文件或显示在屏幕上大卫的回答工作正常,但如果一个函数或库需要分析一个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); 
23

要转换的最简单的方式来QString焦炭*qPrintable(const QString& str), 这是扩展到str.toLocal8Bit().constData()宏。

+0

这可以帮助我与QObject :: tr的东西,谢谢。 – Joel 2016-06-10 05:00:04

+0

为什么这不是一个更受欢迎的答案?我在Qt源代码中偶然了解到这一点,而这正是他们所做的。 – Phlucious 2016-06-22 15:59:00

+1

@Phlucious,因为:1)'qPrintable'返回'const char *'而不是'char *','str.toLocal8Bit()。data()'返回'char *'。 2)只要在使用'qPrintable'的语句中输入分号,指向'const char *'的指针就会失效。所以'const char * c_ptr = s.toLocal8Bit()。constData();'没有任何意义。 – WindyFields 2017-09-14 03:21:56

1

正确的解决方案会是这样

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<<"<---"; 
+0

忘记使用C风格的铸造。 – kyb 2017-12-23 11:36:13