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