编译以下代码......
#define UNICODE
#include<wchar.h>
#include<windows.h>
#include<string>
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
LPWSTR str1=L"vishal ";
LPWSTR str2=L"nechwani";
LPWSTR str3=str1 + str2;
MessageBox(NULL,str3,str3,MB_OK);
return 0;
}
...产生此错误:
错误==&gt;错误:类型'LPWSTR {aka wchar_t *}'和'LPWSTR {aka wchar_t *}'的无效操作数为二进制'operator +'
为什么我不能连接这样的两个字符串?
答案 0 :(得分:7)
LPWSTR
是指向宽字符数组的指针。它不是具有+重载的类,因此您无法将LPWSTR
与+连接。请考虑使用wstring
。
#define UNICODE
#include<windows.h>
#include<string>
int main()
{
std::wstring str1(L"vishal ");
std::wstring str2(L"nechwani");
std::wstring str3 = str1 + str2;
MessageBox(NULL, str3.c_str(), str3.c_str(), MB_OK);
return 0;
}
如果你必须忍受c风格的字符串,请使用wcscat
,但不要忘记为str3
预先分配存储空间。
这是一种愚蠢的方式,因为看看你必须做的所有额外工作:
#define UNICODE
#include<cwchar>
#include<windows.h>
int main()
{
LPCWSTR str1=L"vishal "; // note LPCWSTR. L"vishal " provides a constant array
// and it should be assigned to a constant pointer
LPCWSTR str2=L"nechwani";
// find out how much space we need
size_t len = wcslen(str1) + // length string 1
wcslen(str2) + // length string 2
1; // null terminator. Can't have a c-style string without one
LPWSTR str3 = new wchar_t[len]; // allocate space for concatenated string
// Note you could use a std::unique_ptr here,
// but for smurf's sake just use a wstring instead
str3[0] = L'\0'; // null terminate string
//add string 1 and string 2 to to string 3
wcscat(str3,str1);
wcscat(str3,str2);
MessageBox(NULL,str3,str3,MB_OK);
delete[] str3; // release storage allocated to str3
return 0;
}
被这个烂摊子搞糊涂没有羞耻感。这是一团糟。
wcsncat
可能不适合在此处使用。要正确显示连接字符串,您必须调整缓冲区的大小,使其太大而不能截断或分配足够大的缓冲区以包含字符串。我选择分配一个足够大的缓冲区。另请注意,wcsncat
仍然可以超出放置空终止符的缓冲区末尾,因此count参数必须不超过缓冲区大小的一个。
wstring
为你做了所有这些废话,并免费增加了许多其他有用的操作。没有充分理由避免string
而不使用string
是愚蠢的。别傻了。