C++ Qt字符串函数之间的差异
我使用Qt-4.7.4版本在VS2005上做了一个项目。在那个项目中,我使用了lineEdit,并像这样从lineEdit中提取文本C++ Qt字符串函数之间的差异,c++,visual-studio-2010,qt,qlineedit,C++,Visual Studio 2010,Qt,Qlineedit,我使用Qt-4.7.4版本在VS2005上做了一个项目。在那个项目中,我使用了lineEdit,并像这样从lineEdit中提取文本 const char* test= lineEdit->text().toStdString().c_str(); 上面的代码行工作得很好,但现在我使用的是VS2010,使用的是同样的代码行,但是它没有为test变量显示任何内容 qDebug()<<lineEdit->text()<<endl; 上面这一行现在完美地向我展示
const char* test= lineEdit->text().toStdString().c_str();
上面的代码行工作得很好,但现在我使用的是VS2010,使用的是同样的代码行,但是它没有为test
变量显示任何内容
qDebug()<<lineEdit->text()<<endl;
上面这一行现在完美地向我展示了VS2010上的一切
我不知道为什么constchar*test=lineEdit->text().toStdString().c_str()
在VS2005上运行得很好,为什么不在VS2010上运行呢
此运算符(QString::toStdString())仅在Qt配置为启用STL兼容性时可用
所以我猜VS2005和VS2010之间存在一些配置问题
作为旁注:
您不应该使用c_str()
返回的指针。如果QString
发生更改或超出范围,则QString::toStdString()
返回的std::string
也会发生变化,指针将失效。如果您通过复制该指针在其他地方使用它,您将有未定义的行为。最好从text()
属性中创建一个std::string
/QString
对象,然后使用它
此运算符(QString::toStdString())仅在Qt配置为启用STL兼容性时可用
所以我猜VS2005和VS2010之间存在一些配置问题
作为旁注:
您不应该使用
c_str()
返回的指针。如果QString
发生更改或超出范围,则QString::toStdString()
返回的std::string
也会发生变化,指针将失效。如果您通过复制该指针在其他地方使用它,您将有未定义的行为。最好从text()
属性中创建一个std::string
/QString
对象,然后使用它。这是错误的!在一种情况下,这是靠运气实现的
这里涉及临时对象。在chainlineEdit->text().toStdString().c_str()
中有临时对象:QString
,std::string
现在,最后一个临时对象为您提供指向c字符串的指针,并且该对象是该c字符串的所有者。在下一行之前,临时对象被销毁,c字符串也被释放 它在VS2005中运行纯属运气。代码不正确 只有在单行中使用值时,此链才起作用。所以这几行是正确的:
qDebug() << lineEdit->text().toStdString().c_str();
someFinction(lineEdit->text().toStdString().c_str());
qDebug()text().toStdString().c_str();
someFinction(lineEdit->text().toStdString().c_str());
另一种解决方法:
std::string s = lineEdit->text().toStdString();
qDebug() << s.c_str();
someFunction(s.c_str());
std::string s=lineEdit->text().toStdString();
qDebug()这是错误的!在一种情况下,这是靠运气实现的
这里涉及临时对象。在chainlineEdit->text().toStdString().c_str()
中有临时对象:QString
,std::string
现在,最后一个临时对象为您提供指向c字符串的指针,并且该对象是该c字符串的所有者。在下一行之前,临时对象被销毁,c字符串也被释放
它在VS2005中运行纯属运气。代码不正确
只有在单行中使用值时,此链才起作用。所以这几行是正确的:
qDebug() << lineEdit->text().toStdString().c_str();
someFinction(lineEdit->text().toStdString().c_str());
qDebug()text().toStdString().c_str();
someFinction(lineEdit->text().toStdString().c_str());
另一种解决方法:
std::string s = lineEdit->text().toStdString();
qDebug() << s.c_str();
someFunction(s.c_str());
std::string s=lineEdit->text().toStdString();
qDebug()在Qt-land中时,使用Qt类和函数。如果你不写一个外部接口,我真的避免改变到标准C++类,甚至我更喜欢坚持QT的一方。实际上我正在编写一个外部接口……我在MunGDB中使用这个Link EEDIT值。它与const char一起工作。它期望什么编码?code>QString
是Unicode,所以这很重要。在Qtland中,使用Qt类和函数。如果你不写一个外部接口,我真的避免改变到标准C++类,甚至我更喜欢坚持QT的一方。实际上我正在编写一个外部接口……我在MunGDB中使用这个Link EEDIT值。它与const char一起工作。它期望什么编码?code>QString
是Unicode,所以这很重要。实际上,我认为只要stdstring有效,c_str
就有效,所以一旦它被销毁(在分号处),c_str就不再有效valid@ratchetfreak对在分号之后,QString
超出范围,char*
也超出范围。我想我提到过。@RakibulHasan你指的是一个真正的缺陷。我们的应用程序因此产生了垃圾日志。这同样适用于lineEdit->text().toLatin1().data()
。事实上,我认为c_str
只有在stdstring有效时才有效,因此一旦它被销毁(分号处),c_str就不再有效valid@ratchetfreak对在分号之后,QString
超出范围,char*
也超出范围。我想我提到过。@RakibulHasan你指的是一个真正的缺陷。我们的应用程序因此产生了垃圾日志。lineEdit->text().toLatin1().data()
也是如此。在示例中的第二行中,传递的指针仅在函数内部有效,如果它将其存储以供以后访问,您将获得未定义的行为。这在我解释问题时是显而易见的。亲爱的先生,我在问题中已经提到,即使是std::cout
也不是这样工作的。std::cout和关于qDebug()
,它之所以有效,是因为它直接打印QString值,而不需要将其转换为std::string
和c_str
。我建议改进这个问题,而不是将代码包含在std::cout
中。记住要包括QString
的确切内容以及您在控制台上获得的内容。我怀疑