2013-06-27 40 views
0

这里的一些测试代码:皈依产生空字符串

QString qstr_test("TEST"); 
const char *p = qstr_test.toStdString().c_str(); 
cout << p << endl; 

没有什么输出作为p是空字符串。

这是我在调试了:

std::basic_string<char,std::char_traits<char>,std::allocator<char> >::c_str 
returns: 0x003bf9d4 "TEST" 

p  : 0x003bf9d4 "" 

看来p指向正确的位置,但并没有显示正确的内容。

为什么p是空的?

+2

当你看到'cout << p << endl;'line?时,你确定'toStdString()'返回的'std :: string'仍然存在吗? – Apokal

+0

@Apokal启蒙我!谢谢 ! – CDT

回答

4

std::string对象是临时的,在c_str()完成后立即销毁。但std::string拥有char*缓冲区返回c_str()和此缓冲区也被破坏。所以你的代码是不正确和危险的。您需要存储std::string只要您使用char*缓冲区:

std::string s = qstr_test.toStdString(); 
const char* p = s.c_str(); 

而且似乎毫无意义的创造std::string只是将它转换为char*QString有更好的方法:toLatin1,toLocal8bittoUtf8。请注意,返回QByteArray具有相同的问题,这是常见的错误来源。如果您想使用其缓冲区,则还必须存储QByteArray

QByteArray array = qstr_test.toUtf8(); 
const char* p = array.constData(); 

我认为这种方法更好,因为在这里你明确指定了你需要使用的编码。而toStdString结果取决于QTextCodec::codecForCStrings()当前值。

+0

'toAscii'不应该再被使用,它会在Qt 5中被移除。你应该使用'toLatin1' – WoJo

+0

@WoJo Nay,'toUtf8()'是优越的。 – user1095108

+0

toUtf8只有在您需要UTF-8时才会优越。 –