目錄html
零基礎 C/C++ 學習路線推薦 : C/C++ 學習目錄 >> C 語言基礎入門python
C
語言在 string.h
中 strcpy
函數,可用完成 char 字符串拷貝;而今天即將介紹的 strcpy_s
函數其實和 strcpy
函數相似, strcpy
函數使用時,咱們也注意到了兩個問題:編程
詳細介紹請參考:C 語言 error C4996: This function or variable may be unsafewindows
error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 解決辦法:include 以後添加代碼 #pragma warning( disable : 4996)
strcpy_s
是系統的安全函數,微軟在 2005 後建議用一系統所謂安全的函數,這中間就有 strcpy_s
取代了 strcpy
;
strcpy
函數沒有方法來保證有效的緩衝區尺寸,因此它僅僅能假定緩衝足夠大來容納要拷貝的字符串。在程序執行時,這將致使不可預料的行爲,容易致使程序崩潰,例如以下代碼:安全
/******************************************************************************************/ //@Author:猿說編程 //@Blog(我的博客地址): www.codersrc.com //@File:C語言教程 - C語言 strcpy_s 函數 //@Time:2021/06/03 08:00 //@Motto:不積跬步無以致千里,不積小流無以成江海,程序人生的精彩須要堅持不懈地積累! /******************************************************************************************/ char src[1024] = { "C/C++教程-strcpy函數\0 - www.codersrc.com" }; char dst[10] = { 0 }; int len_src = sizeof(src)/sizeof(char); // 1024 int len_dst = sizeof(dst) / sizeof(char); //10 printf("len_src:%d len_dst:%d\n", len_src,len_dst); printf("strcpy以前 dst:%s\n", dst); strcpy(dst, src); // 很明顯 dst 的空間大小並不能徹底存放 src,程序會崩潰 printf("strcpy以後 dst:%s\n", dst);
strcpy_s
函數能夠經過設置目標緩衝區大小來夠避免上面的不可預料的行爲,語法以下:ide
/* *描述:此類函數是用於對字符串進行復制(拷貝)。 * *參數: * [out] strDestination:拷貝完成以後的字符串 * [in] numberOfElements: strDestination目標緩衝區長度 * [in] strSource:須要拷貝的字符串 * *返回值:返回一個整數,0表示複製成功,返回非0值表明複製不成功,不一樣的值表示不一樣的錯誤,具體內容能夠查閱MSDN手冊 */ errno_t strcpy_s(char *strDestination , size_t numberOfElements , const char *strSource);
/******************************************************************************************/ //@Author:猿說編程 //@Blog(我的博客地址): www.codersrc.com //@File:C語言教程 - C語言 strcpy_s 函數 //@Time:2021/06/03 08:00 //@Motto:不積跬步無以致千里,不積小流無以成江海,程序人生的精彩須要堅持不懈地積累! /******************************************************************************************/ #include "stdafx.h" #include<stdlib.h> #include<stdio.h> #include<string.h> #include "windows.h" //error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. //#pragma warning( disable : 4996) void main() { char src[1024] = { "C/C++教程-strcpy_s函數 - www.codersrc.com" }; char dst[1024] = { 0 }; int len_src = sizeof(src)/sizeof(char); int len_dst = sizeof(dst) / sizeof(char); printf("len_src:%d len_dst:%d\n", len_src,len_dst); printf("strcpy_s以前 dst:%s\n", dst); strcpy_s(dst, sizeof(dst)/sizeof(dst[0]), src); printf("strcpy_s以後 dst:%s\n", dst); printf("\n"); system("pause"); } /* 輸出: len_src:1024 len_dst:1024 strcpy_s以前 dst: strcpy_s以後 dst:C/C++教程-strcpy_s函數 - www.codersrc.com 請按任意鍵繼續. . . */
注意:strcpy_s
函數第二個參數,是設置目標緩衝區大小,並不是原始緩衝區大小函數
strcpy_s(dst, sizeof(dst)/sizeof(dst[0]), src); //正確寫法 strcpy_s(dst, sizeof(src)/sizeof(src[0]), src); //錯誤寫法
在 char
字符串中有做介紹,字符串默認都是'\0'
結尾,strcpy_s
函數在拷貝過程當中,若是遇到'\0'
結束符,那麼直接結束拷貝,看下面例子:學習
/******************************************************************************************/ //@Author:猿說編程 //@Blog(我的博客地址): www.codersrc.com //@File:C語言教程 - C語言 strcpy_s 函數 //@Time:2021/06/03 08:00 //@Motto:不積跬步無以致千里,不積小流無以成江海,程序人生的精彩須要堅持不懈地積累! /******************************************************************************************/ char src[1024] = { "C/C++教程-strcpy_s函數\0 - www.codersrc.com" }; char dst[1024] = { 0 }; printf("strcpy_s以前 dst:%s\n", dst); strcpy_s(dst, sizeof(dst)/sizeof(dst[0]), src); printf("strcpy_s以後 dst:%s\n", dst); printf("\n"); system("pause"); /* 輸出: strcpy_s以前 dst: strcpy_s以後 dst:C/C++教程-strcpy_s函數 請按任意鍵繼續. . . */
重上面的輸出結果能夠看出:strcpy_s
函數在拷貝的時候,若是遇到 '\0'
,那麼拷貝直接結束,因此上面使用 strcpy_s
拷貝的時候,dst
字符串明顯少了一段字符" - www.codersrc.com"
;字體
未經容許不得轉載:猿說編程 » C 語言 strcpy_s 函數插件
本文由博客 - 猿說編程 猿說編程 發佈!