C++ 为什么我在使用WideChartMultiByte时得到错误的字符数组?

C++ 为什么我在使用WideChartMultiByte时得到错误的字符数组?,c++,winapi,C++,Winapi,Windows 7,Visual Studio 2015 #ifdef UNICODE char *buffer = NULL; int iBuffSize = WideCharToMultiByte(CP_ACP, 0, result_msg.c_str(), result_msg.size(), buffer, 0, NULL, NULL); buffer = static_cast<char*>(malloc(iBuffSize));

Windows 7,Visual Studio 2015

#ifdef UNICODE
    char *buffer = NULL;
    int iBuffSize = WideCharToMultiByte(CP_ACP, 0, result_msg.c_str(),
        result_msg.size(), buffer, 0, NULL, NULL);

    buffer = static_cast<char*>(malloc(iBuffSize));
    ZeroMemory(buffer, iBuffSize);

    WideCharToMultiByte(CP_ACP, 0, result_msg.c_str(),
        result_msg.size(), buffer, iBuffSize, NULL, NULL);

    string result_msg2(buffer);
    free(buffer);

    throw runtime_error(result_msg2);
#else
    throw runtime_error(result_msg);
#endif  
#ifdef UNICODE
char*buffer=NULL;
int iBuffSize=WideCharToMultiByte(CP\u ACP,0,result\u msg.c\u str(),
结果_msg.size(),缓冲区,0,NULL,NULL);
缓冲区=静态_转换(malloc(iBuffSize));
零内存(缓冲区、iBuffSize);
WideChartMultiByte(CP_ACP,0,result_msg.c_str(),
结果_msg.size(),缓冲区,iBuffSize,NULL,NULL);
字符串结果\u msg2(缓冲区);
自由(缓冲);
抛出运行时错误(结果msg2);
#否则
抛出运行时错误(结果消息);
#恩迪夫
result\u msg
对于unicode是
std::wstring
,对于多字节字符集是
std::string

对于多字节字符集:

对于Unicode字符集:


您将输入字符串大小指定为
result\u msg.size()
,它不包括终止的空字符,因此输出也不会以空结尾。但是,当您将
缓冲区
转换为
字符串
时,您没有指定
缓冲区
的大小,因此
字符串
构造函数需要空终止符。如果没有终止符,它将从周围的内存中抓取数据,直到遇到空字节(或出现内存访问错误)

使用
result\u msg.size()+1
作为输入大小,或指定
-1
作为输入大小,以使
wideChartMultiByte()
自动确定输入大小。任何一种方法都会在输出中包含空终止符

或者,继续使用
result\u msg.size()
s输入大小,并在将
buffer
转换为
字符串时使用
iBuffSize
的值,则不需要空终止符:

string result_msg2(buffer, iBuffSize);

您将输入字符串大小指定为
result\u msg.size()
,它不包括终止的空字符,因此输出也不会以空结尾。但是,当您将
缓冲区
转换为
字符串
时,您没有指定
缓冲区
的大小,因此
字符串
构造函数需要空终止符。如果没有终止符,它将从周围的内存中抓取数据,直到遇到空字节(或出现内存访问错误)

使用
result\u msg.size()+1
作为输入大小,或指定
-1
作为输入大小,以使
wideChartMultiByte()
自动确定输入大小。任何一种方法都会在输出中包含空终止符

或者,继续使用
result\u msg.size()
s输入大小,并在将
buffer
转换为
字符串时使用
iBuffSize
的值,则不需要空终止符:

string result_msg2(buffer, iBuffSize);

std::string::size()
返回字符数,不包括零终止符。转换为Unicode时,忽略零终止符。目标字符串不是以零结尾的,当您将其转换为字符串时,它只会拾取垃圾。使用带有显式长度参数的。
std::vector
优于malloc。无论如何,你不应该在C++中使用。在C++中,您希望使用<代码>新< /代码>。<代码>:ST::Sig::(代码)< /代码>返回字符的数目,不包括零终止符。转换为Unicode时,忽略零终止符。目标字符串不是以零结尾的,当您将其转换为字符串时,它只会拾取垃圾。使用带有显式长度参数的。
std::vector
优于malloc。无论如何,你不应该在C++中使用。您希望在C++中使用<代码>新< /Cord>。我不知道<代码> WString 和<代码>字符串< /代码>保持它们的ValUS,因此我将使用<代码> ++BIFFFEXSIGH;<代码>而不是
-1
。谢谢,不用了。使用-1
c_str()
以null结尾。此外,不要太沉迷于增量运算符。如果-1不可用,您将传递
iBuffSize+1
以避免更改
iBuffSize
的含义。我不知道
wstring
string
如何保存它们的值,因此我将使用
++iBuffSize而不是
-1
。谢谢,不用了。使用-1
c_str()
以null结尾。此外,不要太沉迷于增量运算符。如果-1不可用,则应传递
iBuffSize+1
,以避免更改
iBuffSize
的含义。