mbstowcs、_mbstowcs_l
ワイド文字の対応するシーケンスにマルチバイト文字のシーケンスを変換します。 これらの関数のセキュリティを強化したバージョンについては、「mbstowcs_s、_mbstowcs_s_l」を参照してください。
size_t mbstowcs(
wchar_t *wcstr,
const char *mbstr,
size_t count
);
size_t _mbstowcs_l(
wchar_t *wcstr,
const char *mbstr,
size_t count,
_locale_t locale
);
template <size_t size>
size_t mbstowcs(
wchar_t (&wcstr)[size],
const char *mbstr,
size_t count
); // C++ only
template <size_t size>
size_t _mbstowcs_l(
wchar_t (&wcstr)[size],
const char *mbstr,
size_t count,
_locale_t locale
); // C++ only
パラメーター
[出力] wcstr
ワイド文字のシーケンスのアドレス。[] mbstr
null で終わる文字列のマルチバイト文字のシーケンスのアドレス。[入力] count
変換するマルチバイト文字の最大数。[入力] locale
使用するロケール。
戻り値
mbstowcs が正常にソース文字列を変換すると、変換されたマルチバイト文字数を返します。 wcstr の引数が NULLの場合、関数の戻り値のコピー先文字列の必須のサイズ (ワイド文字単位)。 mbstowcs に無効なマルチバイト文字があると、–1 を返します。 戻り値が count場合、ワイド文字列が null で終わるではありません。
セキュリティに関するメモ |
---|
wcstr と mbstr が重複しないよう、count が変換に正しくマルチバイト文字数を反映していることを確認します。 |
解説
mbstowcs 関数は現在のロケールで決められた対応するワイド文字列を mbstr が指す count のマルチバイト文字の最大数に達するまで、変換します。 これは wcstrで表されるアドレスで発生したワイド文字列を格納します*。*結果は mbtowcに一連の呼び出しと似ています。 mbstowcs が前の空白文字 count が発生したとき (「\0」) により前にある場合、または stop ワイド文字の空白文字 (L」\0」) に null 文字を変換できます。 したがって wcstr のワイド文字列には、null 文字が変換中に呼び出されたときにのみ null で終わるです。 wcstr と mbstr の重複が指すシーケンスの動作は未定義です。
wcstr の引数が NULLの場合、mbstowcs は変換に起因する null 終端文字などのワイド文字数を、返します。 元の文字列が返されます。正しい値に null で終わるである必要があります。 結果のワイド文字列が null で終わるであることが必要な場合は、戻り値に 1 を加算します。
mbstr の引数が NULLであるか、または count が INT_MAXの場合、> 無効なパラメーター ハンドラーが パラメーターの検証 "に説明されているように、呼び出されます。 実行の継続が許可された場合、errno が EINVAL および関数の戻り値が -1 に設定されます。
mbstowcs は、すべてのロケールに依存する動作に現在のロケールを使用して; _mbstowcs_lは同じですが、渡されたロケールを代わりに使用します。 詳細については、「ロケール」を参照してください。
C++ では、これらの関数にテンプレートのオーバーロードがあります。このオーバーロードは、これらの関数に対応するセキュリティで保護された新しい関数を呼び出します。 詳細については、「セキュリティ保護されたテンプレート オーバーロード」を参照してください。
必要条件
ルーチン |
必須ヘッダー |
---|---|
mbstowcs |
<stdlib.h> |
_mbstowcs_l |
<stdlib.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
// crt_mbstowcs.c
// compile with: /W3
// illustrates the behavior of the mbstowcs function
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
int main( void )
{
size_t size;
int nChar = 2; // number of characters to convert
int requiredSize;
unsigned char *pmbnull = NULL;
unsigned char *pmbhello = NULL;
char* localeInfo;
wchar_t *pwchello = L"\x3042\x3043"; // 2 Hiragana characters
wchar_t *pwc;
/* Enable the Japanese locale and codepage */
localeInfo = setlocale(LC_ALL, "Japanese_Japan.932");
printf("Locale information set to %s\n", localeInfo);
printf( "Convert to multibyte string:\n" );
requiredSize = wcstombs( NULL, pwchello, 0); // C4996
// Note: wcstombs is deprecated; consider using wcstombs_s
printf(" Required Size: %d\n", requiredSize);
/* Add one to leave room for the null terminator. */
pmbhello = (unsigned char *)malloc( requiredSize + 1);
if (! pmbhello)
{
printf("Memory allocation failure.\n");
return 1;
}
size = wcstombs( pmbhello, pwchello, requiredSize + 1); // C4996
// Note: wcstombs is deprecated; consider using wcstombs_s
if (size == (size_t) (-1))
{
printf("Couldn't convert string. Code page 932 may"
" not be available.\n");
return 1;
}
printf( " Number of bytes written to multibyte string: %u\n",
(unsigned int) size );
printf( " Hex values of the " );
printf( " multibyte characters: %#.2x %#.2x %#.2x %#.2x\n",
pmbhello[0], pmbhello[1], pmbhello[2], pmbhello[3] );
printf( " Codepage 932 uses 0x81 to 0x9f as lead bytes.\n\n");
printf( "Convert back to wide-character string:\n" );
/* Assume we don't know the length of the multibyte string.
Get the required size in characters, and allocate enough space. */
requiredSize = mbstowcs(NULL, pmbhello, 0); // C4996
/* Add one to leave room for the NULL terminator */
pwc = (wchar_t *)malloc( (requiredSize + 1) * sizeof( wchar_t ));
if (! pwc)
{
printf("Memory allocation failure.\n");
return 1;
}
size = mbstowcs( pwc, pmbhello, requiredSize + 1); // C4996
if (size == (size_t) (-1))
{
printf("Couldn't convert string--invalid multibyte character.\n");
}
printf( " Characters converted: %u\n", (unsigned int)size );
printf( " Hex value of first 2" );
printf( " wide characters: %#.4x %#.4x\n\n", pwc[0], pwc[1] );
free(pwc);
free(pmbhello);
}
同等の .NET Framework 関数
使用できません。標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。