桜、抹茶、白、日記

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

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

d:id:youandi:20081208#p3
マルチバイト文字列処理というよりも、strcpy_s/strncpy_sの使い方メモ。


今やっている作業で、strncpy_sを使っているコードがあって、どう書くのが正しいのか調べる。

// 当然ながらプロジェクトの文字セットの設定は「マルチバイト文字を使用する」で。
#include <stdio.h>
#include <locale.h>
#include <tchar.h>

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

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

void Test()
{
    const int    CHAR_SIZE              = 8;
    const TCHAR  szMBS[]                = _T("あいうえおかきくけこ");
    TCHAR        szText[ CHAR_SIZE ]    = { 0 };
    TCHAR*       pDst                   = &szText[ 0 ];

    (void)::_tsetlocale( LC_ALL, _T("japanese") );

    // 追加分
    ::_tcscpy_s( szText, szMBS );
    ::_tcscpy_s( pDst, CHAR_SIZE - 1, szMBS );

    ::_tcsncpy_s( szText, szMBS, _TRUNCATE );
    ::_tcsncpy_s( pDst, CHAR_SIZE - 1, szMBS, _TRUNCATE );

    ::_stprintf_s( szText, _T("%s"), szMBS );
    ::_stprintf_s( pDst, CHAR_SIZE - 1, _T("%s"), szMBS );

    ::_sntprintf_s( szText, _TRUNCATE, _T("%s"), szMBS );
    ::_sntprintf_s( pDst, CHAR_SIZE - 1, _TRUNCATE, _T("%s"), szMBS );

    // 以前の分
    ::_tcsncpy( szText, szMBS, _countof( szText ) - 1 );
    ::lstrcpyn( szText, szMBS, _countof( szText ) );
    ::StrCpyN( szText, szMBS, _countof( szText ) );
    ::StringCbCopy( szText, sizeof( szText ), szMBS );
    ::StringCchCopy( szText, _countof( szText ), szMBS );

    ::_sntprintf( szText, _countof( szText ) - 1, _T("%s"), szMBS );
    ::wnsprintf( szText, _countof( szText ), _T("%s"), szMBS );
    ::StringCbPrintf( szText, sizeof( szText ), _T("%s"), szMBS );
    ::StringCchPrintf( szText, _countof( szText ), _T("%s"), szMBS );

    ::fgetc( stdin );
}