wcsncpy, wcsncpy_s
來自 cppreference.com
在標頭檔案 <wchar.h> 中定義 |
||
(1) | ||
wchar_t* wcsncpy( wchar_t* dest, const wchar_t* src, size_t count ); |
(自 C95 起) (直到 C99) |
|
wchar_t *wcsncpy( wchar_t *restrict dest, const wchar_t *restrict src, size_t count ); |
(C99 起) | |
errno_t wcsncpy_s( wchar_t *restrict dest, rsize_t destsz, const wchar_t *restrict src, rsize_t count); |
(2) | (C11 起) |
1) 將
src
指向的寬字串(包括終止空寬字元)中的最多 count
個字元複製到 dest
指向的寬字元陣列中。 如果在複製整個字串
src
之前達到了 count
,則結果寬字元陣列不是以空字元結尾的。 如果從
src
複製終止空寬字元後,count
尚未達到,則會將額外的空寬字元寫入 dest
,直到總共寫入了 count
個字元。 如果字串重疊,則行為未定義。
2) 與 (1) 相同,但該函式不會繼續向目標陣列寫入零以填充到
count
,它會在寫入終止空字元後停止(如果源中沒有空字元,它會在 dest[count] 處寫入一個然後停止)。此外,會在執行時檢測到以下錯誤並呼叫當前安裝的約束處理程式函式- `src` 或 `dest` 是空指標
-
destsz
或count
為零或大於 RSIZE_MAX/sizeof(wchar_t) -
count
大於或等於destsz
,但destsz
小於或等於 wcsnlen_s(src, count),換句話說,會發生截斷 - 源字串和目標字串之間會發生重疊
- 與所有進行邊界檢查的函式一樣,僅當實現定義了 __STDC_LIB_EXT1__ 並且使用者在包含 <wchar.h> 之前將 __STDC_WANT_LIB_EXT1__ 定義為整數常量 1 時,才能保證
wcsncpy_s
可用。
目錄 |
[編輯] 引數
dest | - | 指向要複製到的寬字元陣列的指標 |
src | - | 指向要從中複製的寬字串的指標 |
count | - | 要複製的最大寬字元數 |
destsz | - | 目標緩衝區的尺寸 |
[編輯] 返回值
1) 返回 `dest` 的副本
2) 成功時返回零,錯誤時返回非零。此外,在錯誤時,將 L'\0' 寫入 dest[0](除非
dest
是空指標或 destsz
為零或大於 RSIZE_MAX/sizeof(wchar_t)),並且可能會用未指定的值覆蓋目標陣列的其餘部分。[編輯] 注意
在典型用法中,count
是目標陣列中的元素數量。
儘管截斷以適應目標緩衝區是一個安全風險,因此對於 wcsncpy_s
來說是執行時約束違規,但可以透過指定 count
等於目標陣列大小減一來獲得截斷行為:它將複製前 count
個寬字元並像往常一樣附加空寬終止符:wcsncpy_s(dst, sizeof dst / sizeof *dst, src, (sizeof dst / sizeof *dst)-1);
[編輯] 示例
執行此程式碼
#include <stdio.h> #include <wchar.h> #include <locale.h> int main(void) { const wchar_t src[] = L"わゐ"; wchar_t dest[6] = {L'あ', L'い', L'う', L'え', L'お'}; wcsncpy(dest, src, 4); // this will copy わゐ and repeat L'\0' two times puts("The contents of dest are: "); setlocale(LC_ALL, "en_US.utf8"); const long dest_size = sizeof dest / sizeof *dest; for(wchar_t* p = dest; p-dest != dest_size; ++p) { *p ? printf("%lc ", *p) : printf("\\0 "); } }
可能的輸出
The contents of dest are: わ ゐ \0 \0 お \0
[編輯] 參考
- C17 標準 (ISO/IEC 9899:2018)
- 7.29.4.2.2 wcsncpy 函式 (p: 314)
- K.3.9.2.1.2 wcsncpy_s 函式 (p: 464)
- C11 標準 (ISO/IEC 9899:2011)
- 7.29.4.2.2 wcsncpy 函式 (p: 431)
- K.3.9.2.1.2 wcsncpy_s 函式 (p: 640-641)
- C99 標準 (ISO/IEC 9899:1999)
- 7.24.4.2.2 wcsncpy 函式 (p: 377)
[編輯] 另請參閱
(C95)(C11) |
將一個寬字串複製到另一個寬字串 (函式) |
(C95)(C11) |
在兩個不重疊的陣列之間複製一定數量的寬字元 (函式) |
(C11) |
從一個字串複製一定數量的字元到另一個字串 (函式) |
C++ 文件 for wcsncpy
|