wcsrtombs_s
將寬字元字串轉換為其多位元組字元字串表示法。 版本wcsrtombs
具有CRT中的安全性功能中所述的安全性增強功能。
語法
errno_t wcsrtombs_s(
size_t *pReturnValue,
char *mbstr,
size_t sizeInBytes,
const wchar_t **wcstr,
sizeof count,
mbstate_t *mbstate
);
template <size_t size>
errno_t wcsrtombs_s(
size_t *pReturnValue,
char (&mbstr)[size],
const wchar_t **wcstr,
sizeof count,
mbstate_t *mbstate
); // C++ only
參數
pReturnValue
已轉換字串的位元組大小,包括 Null 終止符。
mbstr
所產生之已轉換的多位元組字串的緩衝區位址。
sizeInBytes
mbstr
緩衝區的大小,以位元組為單位。
wcstr
指向要轉換的寬字元字串。
count
要儲存在緩衝區中的 mbstr
位元組數目上限,或 _TRUNCATE
。
mbstate
mbstate_t
轉換狀態物件的指標。
傳回值
如果成功,則為零,如果失敗,則為錯誤碼。
錯誤狀況 | 傳回值和 errno |
---|---|
mbstr 是 NULL 和 sizeInBytes > 0 |
EINVAL |
wcstr 是 NULL |
EINVAL |
目的緩衝區太小,無法包含已轉換的字串 (除非 count 是 _TRUNCATE ,請參閱下面的<備註>) |
ERANGE |
如果發生上述任一情況,則會叫用無效的參數例外狀況,如參數驗證中所述。 如果允許繼續執行,此函式會傳回錯誤碼,並將 errno
設為如表中所示。
備註
wcsrtombs_s
函式會將 wcstr
指向的寬字元字串轉換成儲存在 mbstr
所指向緩衝區的多位元組字元,使用 mbstate
包含的轉換狀態。 除非遇到下列情況之一,否則會繼續為每個字元進行轉換:
遇到 Null 寬字元
遇到無法轉換的寬字元
mbstr
緩衝區中儲存的位元組數目等於count
。
目的地字串一律為 Null 終止(即使發生錯誤也一樣)。
如果 count
是特殊值 _TRUNCATE
,則會 wcsrtombs_s
將和 符合目的緩衝區一樣多的字串轉換成 ,同時仍保留 Null 終止符的空間。
如果 wcsrtombs_s
成功轉換來源字串,則會將已轉換字串的大小以位元組為單位,包括 Null 終止符,放入 *pReturnValue
(未提供 pReturnValue
NULL
)。 即使自變數為 NULL
,也會計算mbstr
大小;它提供方法來判斷所需的緩衝區大小。 如果 mbstr
為 NULL
, count
則會忽略 。
如果 wcsrtombs_s
遇到無法轉換成多位元組字元的寬字元,則會將 *pReturnValue
-1 放入 ,將目的地緩衝區設定為空字串、設定 errno
為 EILSEQ
,並傳 EILSEQ
回 。
如果 wcstr
和 mbstr
所指向的序列重疊,wcsrtombs_s
的行為不明。 wcsrtombs_s
受到目前地區設定之 LC_TYPE 分類的影響。
重要
確定 wcstr
和 mbstr
不會重疊,而且 count
正確反映要轉換的寬字元數。
函式wcsrtombs_s
與 _wcstombs_s_l
wcstombs_s
不同之處在於其可重新啟動性。 針對相同或其他可重新啟動的函式的後續呼叫,轉換狀態會儲存在 mbstate
中。 混合使用可重新啟動和不可重新啟動之函式的結果不明。 例如,如果使用了 wcsrtombs_s
的後續呼叫,而不是 wcstombs_s
,應用程式應該使用 wcsrlen
,而不是 wcslen
。
C++ 利用多載樣板簡化了這些函式的使用方式。多載可自動推斷緩衝區長度 (因而不須指定大小引數),也可以將不安全的舊函式自動取代成較新且安全的對應函式。 如需詳細資訊,請參閱安全範本多載。
根據預設,此函式的全域狀態會限定於應用程式。 若要變更此行為,請參閱 CRT 中的全域狀態。
例外狀況
wcsrtombs_s
函式是安全多執行緒,但前提是當這個函式執行中、且 mbstate
為 Null 時,目前執行緒中沒有任何函式呼叫 setlocale
。
範例
// crt_wcsrtombs_s.cpp
//
// This code example converts a wide
// character string into a multibyte
// character string.
//
#include <stdio.h>
#include <memory.h>
#include <wchar.h>
#include <errno.h>
#define MB_BUFFER_SIZE 100
int main()
{
const wchar_t wcString[] =
{L"Every good boy does fine."};
const wchar_t *wcsIndirectString = wcString;
char mbString[MB_BUFFER_SIZE];
size_t countConverted;
errno_t err;
mbstate_t mbstate;
// Reset to initial shift state
::memset((void*)&mbstate, 0, sizeof(mbstate));
err = wcsrtombs_s(&countConverted, mbString, MB_BUFFER_SIZE,
&wcsIndirectString, MB_BUFFER_SIZE, &mbstate);
if (err == EILSEQ)
{
printf( "An encoding error was detected in the string.\n" );
}
else
{
printf( "The string was successfully converted.\n" );
}
}
The string was successfully converted.
需求
常式 | 必要的標頭 |
---|---|
wcsrtombs_s |
<wchar.h> |
另請參閱
資料轉換
地區設定
多位元組字元序列的解譯
wcrtomb
wcrtomb_s
wctomb
, _wctomb_l
wcstombs
, _wcstombs_l
mbsinit