程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> strcpy_s與strcpy

strcpy_s與strcpy

編輯:C++入門知識


[cpp]
例子: 
#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 

例子:
#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函數則沒有那麼嚴格的檢查與校驗,如果錯誤地傳輸了參數或者緩沖區溢出,那麼錯誤並不能被立刻發現,對於定位程序錯誤也帶來更大困難。


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved