我的代码是
string str = "C:\\Users\\mardare\\Downloads\\config";
LPSTR lp = const_cast<char *>(str.c_str());
MessageBox ( NULL, "The selected folder is : "+lp, "Bye!", MB_OK );
当我尝试构建它并运行时,我得到了这个错误
类型'const char [26]'和'LPSTR'
的无效操作数
答案 0 :(得分:3)
LPSTR
代表char *
- 类型,字符串文字"The ..."
代表const char[26]
。您收到错误是因为在表达式"The selected folder is : "+lp
中,您尝试将它们与运算符+
“连接”,const char*
或char *
类型的成员不支持。
但是+
类型的成员支持运营商std::string
;因此,您可以通过以下代码解决此问题:
string folder = "The selected folder is : " + str;
MessageBox ( NULL, folder.c_str(), "Bye!", MB_OK );
答案 1 :(得分:2)
您正在尝试将char*
指针(从您的string
变量获取)连接到const char[]
数组(来自您的字符串文字)。你无法做到那种连接。
此外,const_cast
不是必需的。
您必须将其中一个指针转换为string
,例如:
string str = "C:\\Users\\mardare\\Downloads\\config";
const char *lp = str.c_str();
MessageBox ( NULL, (string("The selected folder is : ") + lp).c_str(), "Bye!", MB_OK );
或者:
string str = "C:\\Users\\mardare\\Downloads\\config";
const char *lp = str.c_str();
MessageBox ( NULL, ("The selected folder is : " + string(lp)).c_str(), "Bye!", MB_OK );
或者,只需摆脱char*
中的string
,您实际上并不需要它:
string str = "C:\\Users\\mardare\\Downloads\\config";
MessageBox ( NULL, ("The selected folder is : " + str).c_str(), "Bye!", MB_OK );
或者:
string str = "C:\\Users\\mardare\\Downloads\\config";
string msg = "The selected folder is : " + str;
MessageBox ( NULL, msg.c_str(), "Bye!", MB_OK );
或者:
string str = "C:\\Users\\mardare\\Downloads\\config";
ostringstream msg;
msg << "The selected folder is : " << str;
MessageBox ( NULL, msg.str().c_str(), "Bye!", MB_OK );
答案 2 :(得分:1)
如果在这行代码中考虑MessageBox
的第二个参数:
MessageBox ( NULL, "The selected folder is : "+lp, "Bye!", MB_OK ); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
您可以看到一个字符串文字,即"The selected folder is : "
,它是一个NUL终止的C样式原始char
数组(错误消息中的const char [26]
部分);并且您正在尝试“连接”使用运算符+
和lp
,您在其中定义为LPSTR
(即char*
)代码。
此类操作未定义,因此出现错误消息。
很明显,你的意图是连接两个字符串,并打印调用MessageBox
API的结果字符串。
为此,请考虑使用C ++字符串 class 。如果您处于Win32 API边界,我认为ATL / MFC CString
非常方便。或者,您可以使用标准字符串类,如std::string
。
std::string
(和CString
以及......)方便地定义了operator+()
的正确重载,这使得可以用简单的语法连接字符串,例如:
string str = "C:\\Users\\mardare\\Downloads\\config";
string message = "The selected folder is : " + str;
此时,如果您要将消息std::string
实例传递给MessageBox
API(这是一个 C-interface API),您可以调用< strong> std::string::c_str()
方法:
MessageBox( NULL, message.c_str(), /* ... other params ... */ );
请注意,此代码将在ANSI / MBCS版本中编译(这是一个过时的构建设置; Unicode版本自VS2005以来一直是默认版本,超过10年前)。
在您的情况下,被调用的实际Win32 API是MessageBoxA
(请注意A
后缀)。
您的代码将无法在使用Unicode构建的VS解决方案中编译;在这些情况下,您可能希望使用显式MessageBoxA()
调用。
编辑与您的错误消息没有直接关系,但您可能会感兴趣:如果您使用的是最新的Visual C ++编译器,则可能需要将NULL
替换为{ {1}}在您的C ++代码中,您可以使用 raw 字符串文字来简化您编写路径的方式,如下所示:
nullptr
答案 3 :(得分:0)
您无法将const char[26]
(即您的"The selected folder is : "
文字)和char*
指针(即lp
类型LPSTR
变量加在一起},这是char*
)。首先连接字符串,然后获得const char*
,您可以将其传递给函数:
std::string str = R"(C:\Users\mardare\Downloads\config)"; //don't care about escape sequences, use raw string literals.
MessageBox(nullptr, ("The selected folder is : " + str).c_str(), "Bye!", MB_OK);