名稱空間
變體
操作

wcsncpy, wcsncpy_s

來自 cppreference.com
< c‎ | string‎ | wide
在標頭檔案 <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` 是空指標
  • destszcount 為零或大於 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)
將一個寬字串複製到另一個寬字串
(函式) [編輯]
在兩個不重疊的陣列之間複製一定數量的寬字元
(函式) [編輯]
從一個字串複製一定數量的字元到另一個字串
(函式) [編輯]
C++ 文件 for wcsncpy