字符串连接给出错误

时间:2018-01-02 19:49:46

标签: c++ string winapi

编译以下代码......

#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 +'

为什么我不能连接这样的两个字符串?

1 个答案:

答案 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是愚蠢的。别傻了。