strcpy_s、sptintf_s与strcat_s的使用
strcpy_s、sptintf_s與strcat_s是strcpy、sptintf與strcat的安全版本,均是通過指定緩沖區長度來避免存在的溢出風險。
strcpy_s 與strcpy
strcpy_s和strcpy函數的功能幾乎是一樣的。strcpy函數,就象gets函數一樣,它沒有方法來保證有效的緩沖區尺寸,所以它只能假定緩沖足夠大來容納要拷貝的字符串。在程序運行時,這將導致不可預料的行為。用strcpy_s就可以避免這些不可預料的行為。
這個函數用兩個參數、三個參數都可以,只要可以保證緩沖區大小。
三個參數時:
? ? ? ? ? ? ? ? ? ? ? ? errno_t strcpy_s(char *strDestination,size_t numberOfElements,const char *strSource);
兩個參數時:
? ? ? ? ? ? ? ? ? ? ? ?errno_t strcpy_s(char(&strDestination)[size],const char *strSource); // C++ only
例子:
strlen(str1):11
strlen(str):5
hello world
hello
請按任意鍵繼續. . .
sptintf_s與sptintf
sprintf
定義:
int sprintf( char *buffer, const char *format [, argument] ... );
常見用法
//把整數123 打印成一個字符串保存在s 中。
sprintf(s, "%d", 123); //產生"123"
可以指定寬度,不足的左邊補空格:
sprintf(s, "%8d%8d", 123, 4567); //產生:" 123 4567"
當然也可以左對齊:
sprintf(s, "%-8d%8d", 123, 4567); //產生:"123 4567"
也可以按照16 進制打印:
sprintf(s, "%8x", 4567); //小寫16 進制,寬度占8 個位置,右對齊
sprintf(s, "%-8X", 4568); //大寫16 進制,寬度占8 個位置,左對齊
sprintf_s
int sprintf_s( char *buffer, size_t sizeOfBuffer, const char *format [, argument] ... );
strcat_s與strcat
? ? ? ? 原形:? ? ? ? ? ? ? errno_t strcat_s(char *strDestination,size_t numberOfElements,constchar *strSource);
? ? ? ? ? ? ? ? extern char *strcat(char *dest,char *src);
strDestination要為strSource留下足夠的內存,具體為:
假設strDestination為一個數組的話,
sizeof(strDestination)>=sizeof(strSource)+strlen(strDestination);
numberOfElements=sizeof(strDestination)
舉例說明二者的區別:
char szBuf[3] = {0};? ? ? ?strcat_s(szBuf, 3, "kdfdfj"); // 第一種連接字符串方法
? ? ? ?strcat(szBuf, "kdfdfj"); // 第二種連接字符串方法
? ? ? 對于這兩個例句,你仔細看就會發現他們有緩沖區溢出的問題.
? ? ? ? 而用第一個函數則不同,它會拋出一個異常。
? ? ? ? ?但使用第二個函數的結果則不能確定,因為它可能會錯誤地改變了程序中其他部分的內存的數據,有可能不會拋出異常,但 ? ? ? ? 會導致程序數據錯誤,也可能由于非法內存訪問拋出異常 使用規范: ??char string[20]="123"; ?strcat_s(string,sizeof(string),"456"); ?printf("%s",string);這樣20個元素,足夠裝下123456了。 注:以上三個安全函數取緩沖大小numberOfElements時,都可以取成前面那個strDestination的字節大小。 另外我們要注意strDestination到底是指針還是數組,注意二者sizeof的區別,可以混上strlen一起使用。 參考例子:《自定義String》 ?
總結
以上是生活随笔為你收集整理的strcpy_s、sptintf_s与strcat_s的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++深度剖析教程8】C++的操作符重
- 下一篇: nginx中upstream的max_c