首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从“std::string”转换为“LPSTR”

无法从“std::string”转换为“LPSTR”
EN

Stack Overflow用户
提问于 2010-10-11 21:14:10
回答 6查看 45.2K关注 0票数 22

由于我不能将LPCSTR从一个函数传递到另一个函数(数据被更改),所以我尝试将其作为字符串传递。

但稍后我需要再次将其转换回LPSTR。在尝试转换时,我得到了上面的错误:

无法从“std::string”转换为“LPSTR”

我该如何解决这个问题?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-10-11 21:20:57

这只是因为您应该使用std::string::c_str()方法。

但在给定的情况下,这涉及到const_cast,因为c_str()返回的const char *不能分配给非常数LPSTR

代码语言:javascript
复制
std::string str = "something";
LPSTR s = const_cast<char *>(str.c_str());

但您必须确保str的生命周期将比LPTSTR变量的生命周期更长。

另外,如果代码编译为符合Unicode,则LPTSTRstd::string类型是不兼容的。您应该改用std::wstring

重要说明:,如果你从上面把结果指针s传递给一个试图修改它所指向的数据的函数,这将导致未定义的行为。正确处理它的唯一方法是将字符串复制到非常量缓冲区中(例如通过strdup)。

票数 32
EN

Stack Overflow用户

发布于 2010-10-11 22:48:08

如果你需要一个LPSTR,这意味着字符串将会/可能会被修改。std::string::c_str()返回一个const指针,你不能简单地const_cast掉它,然后希望世界上一切都好,因为事实并非如此。字符串可能会以各种令人讨厌的方式改变,而你最初的std::string将会忽略所有这些改变。

试着这样做:

代码语言:javascript
复制
// myFunction takes an LPSTR
std::string cppString = "something";
LPSTR cString = strdup( cppString.c_str() );
try {
   myFunction( cString );
   cppString = cString;
} catch(...) {
   free( cString );
}

将字符串包装在一个智能指针中,去掉try...catch以获得加分(不要忘记自定义deleter)。

票数 8
EN

Stack Overflow用户

发布于 2010-10-11 21:17:53

std::string c_str()上有一个函数。但是,我怀疑您不能在本例中使用std::string。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3906515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档