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ターミネータを含めるか、戻り値に基づいて0で終了する必要があります。

于 2012-05-28T21:37:40.197 に答える