2013-02-15 196 views
3

使用wcscpy_s和使用wcsncpy有什麼實際區別嗎?唯一的區別似乎是參數和返回值的順序:wcsncpy和wcscpy_s有何區別?

errno_t wcscpy_s(wchar_t *strDestination, 
       size_t numberOfElements, 
       const wchar_t *strSource); 

wchar_t *wcsncpy(wchar_t *strDest, 
       const wchar_t *strSource, 
       size_t count); 

如果沒有實際的區別,爲什麼微軟需要添加wcscpy_s到Visual Studio中,當wcsncpy都是現成的和標準的功能?

從Visual Studio移植到gcc時,將wcscpy_s更換爲wcsncpy可以嗎?

回答

9

這兩個函數沒有相同的行爲。

the MSDN documentation of wcscpy_s

成功執行後,目標字符串將永遠是空終止。

wcsncpy說明書(C11 7.29.4.2.2/1-3):

#include <wchar.h> 
wchar_t *wcsncpy(wchar_t * restrict s1, 
    const wchar_t * restrict s2, 
    size_t n); 

wcsncpy功能拷貝不超過n寬字符(那些遵循空 寬字符不復制)從s2指向的數組到 s1指向的數組。

如果數組指向s2是一個寬字符串短於n寬字符,空寬字符被附加到陣列中的拷貝指向s1,直到在所有n寬字符已被寫入

和腳註(#346):

因此,如果沒有空寬字符在所述陣列的所述第一n寬字符由s2指出,所述結果不會以null結尾。

注意strncpywcsncpy不是專爲null結尾的字符串使用。它們設計用於空填充,固定寬度的字符串。

+0

我還會注意到Visual Studio包含了CRT的源代碼。如果您對某個特定功能的實現方式感到好奇(或者兩個功能之間有什麼不同),您可以查看一下。 – 2013-02-15 10:15:31

0

附加_s的函數是更安全的函數。通常,不包含尾部_s的函數將被例如VS2012標記爲「不贊成」。你會得到一個警告。有關其他信息:MSDN有大量的相關信息。

+0

謝謝,但是當它們都接受目標緩衝區的容量時,'wcscpy_s'比'wcsncpy'更安全嗎? – sashoalm 2013-02-15 10:04:08

+0

我相信這不是關於用戶/開發者的安全性,而是關於C-Runtime的安全性。 – 2013-02-15 10:05:09

3

另一個區別(只花了幾個小時的時間盯着代碼,想知道發生了什麼)是,wcscpy_s函數默認情況下會在應用程序溢出緩衝區時終止應用程序。

我預計它會像strncpy變體之一一樣。事實並非如此!

用_set_invalid_parameter_handler函數顯然可以改變這種行爲。