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
例子:
#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;
}
結果:
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] ... );
#include<iostream>
#include<cstring>
using namespace std;int main()
{char filename[1024];//需要預先分配緩沖區char path1[128] = "D:\\Program\\Tesseract-OCR\\tesseract.exe";char path2[128] = "D:\\Program\\Tesseract-OCR\\";char path3[128] = "D:\\Program\\Tesseract-OCR\\txt";char path4[128] = "-l chi_sim";sprintf_s(filename,sizeof(filename), "%s %s %s %s", path1, path2, path3, path4);cout << filename;return 0;
}
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)
舉例說明二者的區別:
? ? ? ?strcat_s(szBuf, 3, "kdfdfj"); // 第一種連接字符串方法
? ? ? ?strcat(szBuf, "kdfdfj"); // 第二種連接字符串方法
? ? ? 對于這兩個例句,你仔細看就會發現他們有緩沖區溢出的問題.
? ? ? ? 而用第一個函數則不同,它會拋出一個異常。
? ? ? ? ?但使用第二個函數的結果則不能確定,因為它可能會錯誤地改變了程序中其他部分的內存的數據,有可能不會拋出異常,但 ? ? ? ? 會導致程序數據錯誤,也可能由于非法內存訪問拋出異常