从QString到char指针的转换生成空字符串

时间:2013-06-27 12:52:46

标签: c++ qt

这是一些测试代码:

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为空?

1 个答案:

答案 0 :(得分: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有更好的方法:toLatin1toLocal8bittoUtf8。请注意,返回的QByteArray具有相同的问题,这是常见的错误来源。如果你想使用它的缓冲区,也必须存储QByteArray

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

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