C++ Qt字符串函数之间的差异

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; 上面这一行现在完美地向我展示

我使用Qt-4.7.4版本在VS2005上做了一个项目。在那个项目中,我使用了lineEdit,并像这样从lineEdit中提取文本

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
对象,然后使用它。

这是错误的!在一种情况下,这是靠运气实现的

这里涉及临时对象。在chain
lineEdit->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()这是错误的!在一种情况下,这是靠运气实现的

这里涉及临时对象。在chain
lineEdit->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
的确切内容以及您在控制台上获得的内容。我怀疑