名稱空間
變體
操作

mbstowcs, mbstowcs_s

來自 cppreference.com
< c‎ | string‎ | multibyte
在標頭檔案 <stdlib.h> 中定義
(1)
size_t mbstowcs( wchar_t          *dst, const char          *src, size_t len)
(直到 C99)
size_t mbstowcs( wchar_t *restrict dst, const char *restrict src, size_t len)
(C99 起)
errno_t mbstowcs_s(size_t *restrict retval, wchar_t *restrict dst,
                  rsize_t dstsz, const char *restrict src, rsize_t len);
(2) (C11 起)
1) 將多位元組字串從src指向的陣列轉換為其寬字元表示。轉換後的字元儲存在dst指向的陣列的後續元素中。寫入目標陣列的寬字元數不超過len
每個字元都如同透過呼叫mbtowc進行轉換,但mbtowc的轉換狀態不受影響。轉換在以下情況下停止:
* 多位元組空字元已轉換並存儲。
* 遇到了無效(在當前C語言環境中)的多位元組字元。
* 將要儲存的下一個寬字元將超過len
如果srcdst重疊,則行為未定義。
2)(1)相同,但:
* 轉換如同透過mbrtowc進行,而不是mbtowc
* 函式將其結果作為輸出引數retval返回
* 如果在寫入len個寬字元後沒有空字元寫入dst,則將L'\0'儲存在dst[len]中,這意味著總共寫入了len+1個寬字元
* 如果dst是空指標,則將生成多少寬字元儲存在*retval
* 函式會從終止空字元到dstsz之間覆蓋目標陣列
* 如果srcdst重疊,則行為未指定。
* 以下錯誤在執行時檢測到並呼叫當前安裝的約束處理函式
  • retvalsrc為空指標
  • dstszlen大於RSIZE_MAX/sizeof(wchar_t)(除非dst為空)
  • dstsz不為零(除非dst為空)
  • src陣列中的前dstsz個多位元組字元中沒有空字元,並且len大於dstsz(除非dst為空)
與所有邊界檢查函式一樣,只有在實現定義了__STDC_LIB_EXT1__且使用者在包含<stdlib.h>之前將__STDC_WANT_LIB_EXT1__定義為整數常量1時,才保證mbstowcs_s可用。

目錄

[編輯] 注意

在大多數實現中,mbstowcs在處理字串時會更新型別為mbstate_t的全域性靜態物件,並且不能由兩個執行緒同時呼叫,在這種情況下應使用mbsrtowcs

POSIX指定了一個常見擴充套件:如果dst為空指標,此函式將返回如果轉換將寫入dst的寬字元數。mbstowcs_smbsrtowcs也有類似的標準行為。

[編輯] 引數

dst - 指向將儲存寬字串的寬字元陣列的指標
src - 指向要轉換的空終止多位元組字串的第一個元素的指標
len - dst指向的陣列中可用的寬字元數
dstsz - 將寫入的最大寬字元數(dst陣列的大小)
retval - 指向一個size_t物件的指標,結果將儲存在此處

[編輯] 返回值

1) 成功時,返回寫入目標陣列的寬字元數,不包括終止的L'\0'。在轉換錯誤時(如果遇到無效的多位元組字元),返回(size_t)-1
2) 成功時返回零(在這種情況下,寫入dst的寬字元數,不包括終止零,將儲存在*retval中),錯誤時返回非零。如果發生執行時約束違例,則在*retval中儲存(size_t)-1(除非retval為空)並將dst[0]設定為L'\0'(除非dst為空或dstmax為零或大於RSIZE_MAX

[編輯] 示例

#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <wchar.h>
 
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    const char* mbstr = u8"z\u00df\u6c34\U0001F34C"; // or u8"zß水🍌"
    wchar_t wstr[5];
    mbstowcs(wstr, mbstr, 5);
    wprintf(L"MB string: %s\n", mbstr);
    wprintf(L"Wide string: %ls\n", wstr);
}

輸出

MB string: zß水🍌
Wide string: zß水🍌

[編輯] 參考文獻

  • C11 標準 (ISO/IEC 9899:2011)
  • 7.22.8.1 mbstowcs函式 (p: 359)
  • K.3.6.5.1 mbstowcs_s函式 (p: 611-612)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.20.8.1 mbstowcs函式 (p: 323)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 4.10.8.1 mbstowcs函式

[編輯] 另請參閱

將窄多位元組字元字串轉換為寬字串,給定狀態
(函式) [編輯]
將寬字串轉換為窄多位元組字元字串
(函式) [編輯]
C++文件關於mbstowcs