1,strlen
strlen所作的僅僅是一個計數器的工作,它從內存的某個位置(可以是字符串開頭,中間某個位置,甚至是某個不確定的內存區域)開始掃描,直到碰到第一個字符串結束符'\0'爲止,然後返回計數器值。
2,strcpy
頭文件:string.h
功能:把從src地址開始且含有NULL結束符的字符串賦值到以dest開始的地址空間
說明:src和dest所指內存區域不可以重疊且dest必須有足夠的空間來容納src的字符串。
返回指向dest的指針。
一下是使用strcpy_s與strcpy的安全性比較
char szBuf[2] = {0};
strcpy_s(szBuf, 2, "12131"); //新的CRT函數
strcpy(szBuf, "12131"); //老的CRT函數
上述代碼,明顯有緩衝區溢出的問題。 使用strcpy_s函數則會拋出一個異常。而使用strcpy函數的結果則未定,因爲它錯誤地改變了程序中其他部分的內存的數據,可能不會拋出異常但導致程序數據錯誤,也可能由於非法內存訪問拋出異常。
使用新的增強安全的CRT函數有什麼好處呢?簡單地說,新的函數加強了對參數合法性的檢查以及緩衝區邊界的檢查,如果發現錯誤,會返回errno或拋出異常。老版本的這些CRT函數則沒有那麼嚴格的檢查與校驗,如果錯誤地傳輸了參數或者緩衝區溢出,那麼錯誤並不能被立刻發現,對於定位程序錯誤也帶來更大困難。
3 strcat 把src所指字符串添加到dest結尾處(覆蓋dest結尾處的'\0')並添加'\0'。strcat_s是VS2005及以後新增的具有更強"安全性"的CRT函數。
4 strcmp
功能:比較字符串s1和s2。
一般形式:strcmp(字符串1,字符串2)
說明:
當s1<s2時,返回值<0
當s1=s2時,返回值=0
當s1>s2時,返回值>0
即:兩個字符串自左向右逐個字符相比(按ASCII值大小相比較),直到出現不同的字符或遇'\0'爲止。如:
"A"<"B" "a">"A" "computer">"compare"
4 memcpy
trcpy和memcpy都是標準C庫函數,它們有下面的特點。
strcpy提供了字符串的複製。即strcpy只用於字符串複製,並且它不僅複製字符串內容之外,還會複製字符串的結束符。
已知strcpy函數的原型是:char* strcpy(char* dest, const char* src);
memcpy提供了一般內存的複製。即memcpy對於需要複製的內容沒有限制,因此用途更廣。
1、複製的內容不同。strcpy只能複製字符串,而memcpy可以複製任意內容,例如字符數組、整型、結構體、類等。
2、複製的方法不同。strcpy不需要指定長度,它遇到被複制字符的串結束符"\0"才結束,所以容易溢出。memcpy則是根據其第3個參數決定複製的長度。
3、用途不同。通常在複製字符串時用strcpy,而需要複製其他類型數據時則一般用memcpy
5 delete
new/ delete 的使用(僅限於c++,注意,new、delete不是函數而是操作符!注意與c中的malloc和free區分)編程的時候經常要用到堆內存的分配,通常使用的操作符是new,這個時候就必然要用到delete去釋放申請的內存空間。
此時至少要遵循以下原則:
(1)new和delete是成對出現的。只出現一個是錯誤的或不規範的寫法,即時能編譯通過,也會有安全隱患;
(2)使用的new與delete要相同。也就是說如果你在 new 表達式中使用了 [],你必須在對應的 delete 表達式中使用 []。如果你在 new 表達式中沒有使用 [],你也不必在對應的 delete 表達式中不使用 []。
(3)對一個指針只能使用一次運算符delete;
例:
printf("-------- 使用 new / delete 情況 ---------------\n");
string *p1=new string("123");//p1申請了一個空間
printf("<%s>\n", p1->c_str());
delete p1;//釋放的時候釋放一個就可以了
printf("-------- 使用 new[] / delete[] 的情況 ---------------\n");
int i;
string* p2 = new string[5];//p2申請了一組空間
for ( i=0; i< 5; i++ )
{
p2.assign("123");
}
for( i=0; i< 5; i++ )
{
printf("%d:%s\n", i, p2.c_str());
}
delete [] p2;//當然要釋放一組了