strcpy_s與strcpy

例子:
#include<iostream>
#include<cstring>
using namespace std;

void Test(void)
{
char *str1=NULL;
str1=new char[20];
char str[7];
strcpy_s(str1,20,"hello world");//三個參數
strcpy_s(str,"hello");//兩個參數但如果:char *str=new char[7];會出錯:提示不支持兩個參數
cout<<"strlen(str1):"<<strlen(str1)<<endl<<"strlen(str):"<<strlen(str)<<endl;
printf(str1);
printf("\n");
cout<<str<<endl;
}

int main()
{
Test();
return 0;
}
#include<iostream> #include<string.h> using namespace std;
void Test(void) { char *str1=NULL; str1=new char[20]; char str[7]; strcpy_s(str1,20,"hello world");//三個參數 strcpy_s(str,"hello");//兩個參數但如果:char *str=new char[7];會出錯:提示不支持兩個參數 cout<<"strlen(str1):"<<strlen(str1)<<endl<<"strlen(str):"<<strlen(str)<<endl; printf(str1); printf("\n"); cout<<str<<endl; }
int main() { Test(); return 0; }
輸出爲:
strlen(str1): 11        //另外要注意:strlen(str1)是計算字符串的長度,不包括字符串末尾的“\0”!!!
strlen(str): 5
hello world
hello

strcpy_s和strcpy()函數的功能幾乎是一樣的。strcpy函數,就象gets函數一樣,它沒有方法來保證有效的緩衝區尺寸,所以它只能假定緩衝足夠大來容納要拷貝的字符串。在程序運行時,這將導致不可預料的行爲。用strcpy_s就可以避免這些不可預料的行爲。
這個函數用兩個參數、三個參數都可以,只要可以保證緩衝區大小。
三個參數時:
errno_t strcpy_s(
char *strDestination,
size_t numberOfElements,
const char *strSource

);

strDestination
位置的位置字符串緩衝區
numberOfElements
目標字符串緩衝區的大小。
strSource
null 終止的源字符串緩衝區.


兩個參數時:
errno_t strcpy_s(
char (&strDestination)[size],
const char *strSource
); // C++ only


在debug版本中使用strcpy_s時,將源字符串拷貝到目標buffer後,會在結束符(‘\0’)後自動使用0xFD填充目標buffer後面的剩餘空間。如果不想編譯器多管閒事,可以在調用strcpy_s前調用_CrtSetDebugFillThreshold(0);

strcpy_s是系統的安全函數,微軟在2005後建議用一系統所謂安全的函數,這中間就有strcpy_s取代了strcpy,原來strcpy函數,就象gets函數一樣,它沒有方法來保證有效的緩衝區尺寸,所以它只能假定緩衝足夠大來容納要拷貝的字符串。

一下是使用strcpy_s與strcpy的安全性比較


 char szBuf[2] = {0};
 strcpy_s(szBuf, 2, "12131");  //新的CRT函數
 strcpy(szBuf,  "12131");    //老的CRT函數

上述代碼,明顯有緩衝區溢出的問題。 使用strcpy_s函數則會拋出一個異常。而使用strcpy函數的結果則未定,因爲它錯誤地改變了程序中其他部分的內存的數據,可能不會拋出異常但導致程序數據錯誤,也可能由於非法內存訪問拋出異常。

使用新的增強安全的CRT函數有什麼好處呢?簡單地說,新的函數加強了對參數合法性的檢查以及緩衝區邊界的檢查,如果發現錯誤,會返回errno或拋出異常。老版本的這些CRT函數則沒有那麼嚴格的檢查與校驗,如果錯誤地傳輸了參數或者緩衝區溢出,那麼錯誤並不能被立刻發現,對於定位程序錯誤也帶來更大困難。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章