以下代码打印所需的输出,但它在字符串的末尾打印垃圾。最后一次调用MultiByteToWideChar有问题,但我无法弄清楚是什么。请帮忙??
#include "stdafx.h"
#include<Windows.h>
#include <iostream>
using namespace std;
#include<tchar.h>
int main( int, char *[] )
{
TCHAR szPath[MAX_PATH];
if(!GetModuleFileName(NULL,szPath,MAX_PATH))
{cout<<"Unable to get module path"; exit(0);}
char ansiStr[MAX_PATH];
if(!WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,szPath,-1,
ansiStr,MAX_PATH,NULL,NULL))
{cout<<"Unicode to ANSI failed\n";
cout<<GetLastError();exit(1);}
string s(ansiStr);
size_t pos = 0;
while(1)
{
pos = s.find('\\',pos);
if(pos == string::npos)
break;
s.insert(pos,1,'\\');
pos+=2;
}
if(!MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,s.c_str(),s.size(),szPath,MAX_PATH))
{cout<<"ANSI to Unicode failed"; exit(2);}
wprintf(L"%s",szPath);
}
答案 0 :(得分:2)
MSDN对cbMultiByte参数有这个说法:
如果此参数为-1,则该函数处理整个输入 string,包括终止空字符。因此, 结果Unicode字符串有一个终止空字符,和 函数返回的长度包括此字符。
如果此参数设置为正整数,则函数处理 完全是指定的字节数。如果提供的尺寸没有 包括一个终止空字符,结果是Unicode字符串 不是以null结尾,并且返回的长度不包括此 字符。
..所以如果你希望输出字符串为0终止,你应该在你传入的长度中包含0终结符或者0根据返回值自行终止...