C++ 为什么我在使用WideChartMultiByte时得到错误的字符数组?
Windows 7,Visual Studio 2015C++ 为什么我在使用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));
#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
。谢谢,不用了。使用-1c_str()
以null结尾。此外,不要太沉迷于增量运算符。如果-1不可用,您将传递iBuffSize+1
以避免更改iBuffSize
的含义。我不知道wstring
和string
如何保存它们的值,因此我将使用++iBuffSize代码>而不是-1
。谢谢,不用了。使用-1c_str()
以null结尾。此外,不要太沉迷于增量运算符。如果-1不可用,则应传递iBuffSize+1
,以避免更改iBuffSize
的含义。