2

以下代码打印所需的输出,但在字符串末尾打印垃圾。最后一次调用 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);
}
4

1 回答 1

2

MSDN 对 cbMultiByte 参数有这样的说法:

如果此参数为 -1,则该函数处理整个输入字符串,包括终止空字符。因此,生成的 Unicode 字符串有一个终止空字符,并且函数返回的长度包括该字符。

如果此参数设置为正整数,则该函数将精确处理指定的字节数。如果提供的大小不包含终止空字符,则生成的 Unicode 字符串不是空终止的,并且返回的长度不包含此字符。

..因此,如果您希望输出字符串以 0 终止,则应在传入的长度中包含 0 终止符,或者根据返回值终止您自己...

于 2012-05-28T21:37:40.197 回答