続・またマルチバイト文字列
この記載には大嘘がありました。
詳しくはこちら(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') ); }