C++ 亂七八糟 筆記

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函數。

  如:
  char szBuf[3]={0};
  1> strcat_s(szBuf,3,"kdfdfj");
  2> strcat(szBuf,"kdfdfj");
  對於這兩個例句,你仔細看就會發現他們有緩衝區溢出的問題.
  而用第一個函數則不同,它會拋出一個異常。
  但使用第二個函數的結果則不能確定,因爲它可能會錯誤地改變了程序中其他部分的內存的數據,有可能不會拋出異常,但會導致程序數據錯誤,也可能由於非法內存訪問拋出異常


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對於需要複製的內容沒有限制,因此用途更廣。

strcpy和memcpy主要有以下3方面的區別。
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;//當然要釋放一組了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章