桜、抹茶、白、日記

名古屋市在住のC++使いのcoderの日記だったもの。

続・またマルチバイト文字列

d:id:youandi:20081111#p2

この記載には大嘘がありました。
詳しくはこちら(d:id:youandi:20081208#p3)を参照願います<(_ _)>

とりあえず、目に付いたAPIを調査。当たり前のように使ってしまっていたけど、やはりちゃんと確認してから使わないと危険だわなorz

API マルチバイト文字対応
_tcsncpy O
lstrcpyn O
StrCpyN, StrNCpy O
StringCbCopy, StringCchCopy X
_sntprintf X
wnsprintf *1 O
StringCbPrintf, StringCchPrintf X
// 当然ながらプロジェクトの文字セットの設定は「マルチバイト文字を使用する」で。
#include <stdio.h>
#include <tchar.h>

#include <windows.h>
#include <shlwapi.h>
#include <strsafe.h>

#pragma comment( lib, "shlwapi.lib" )

void Dump( const TCHAR*, TCHAR );

int _tmain(int argc, _TCHAR* argv[])
{
    const TCHAR	szMBS[] = _T("あいうえお");
    TCHAR		szText[ 9 + 1 ];
    TCHAR&		cCheck = szText[ 8 ];

    szText[ 9 ] = 0;
    (void)::_tcsncpy( szText, szMBS, 9 );
    Dump( _T("_tcsncpy"), cCheck );
    (void)::lstrcpyn( szText, szMBS, 9 );
    Dump( _T("lstrcpyn"), cCheck );
    (void)::StrCpyN( szText, szMBS, 9 );
    Dump( _T("StrCpyN"), cCheck );
    (void)::StringCbCopy( szText, sizeof( szText ), szMBS );
    Dump( _T("StringCbCopy"), cCheck );

    (void)::_sntprintf( szText, 9, _T("%s"), szMBS );
    Dump( _T("_sntprintf"), cCheck );
    (void)::wnsprintf( szText, 9, _T("%s"), szMBS );
    Dump( _T("wnsprintf"), cCheck );
    (void)::StringCbPrintf( szText, sizeof( szText ), _T("%s"), szMBS );
    Dump( _T("StringCbPrintf"), cCheck );

    (void)::fgetc( stdin );
    return 0;
}

void Dump( const TCHAR* pszApi, TCHAR cCheck )
{
    (void)::_ftprintf( stdout, _T("%s\t: %c\n"), pszApi, ( cCheck == 0 ) ? _T('O') : _T('X') );
}

*1:浮動小数点形式「%f」には未対応なので注意