天天看點

c語言中的string

1. strlen(char const* s);

  函數傳入的是c風格字元串(即以‘’結尾的字元數組),傳回的長度為size_t(即unsigned int),其長度不包括''。

2. strcpy(char* dest, char const* source);

  dest:目标指針;

  source:是源指針,傳入的必須是c風格字元串或者字元數組。

  傳回值: dest指針

  注意:1. 該函數會将包括''在内的source全部拷貝到dest。如果char* source="abcd"; dest為char[],則dest應該定義為char[5];

      2. src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字元串。

      3. C語言中不支援用指派符号“=”直接将一個字元數組指派給另一個字元數組。因為C語言不支援運算符重載。故而必須用strcpy操作。

3. strncpy(char* dest, char const* source, size_t n);

  n代表可以指定字元個數進行指派。

  功能:将字元串source中最多n個字元複制到字元數組dest中(它并不像strcpy一樣遇到NULL才停止複制,而是等湊夠n個字元才開始複制),傳回指向dest的指針。要求:如果n > dest串長度,dest棧空間溢出産生崩潰異常。該函數注意的地方和strcpy類似,但是n值需特别注意。

  1)src串長度<=dest串長度,(這裡的串長度包含串尾NULL字元) 

  如果n=(0, src串長度),src的前n個字元複制到dest中。但是由于沒有NULL字元,是以直接通路dest串會發生棧溢出的異常情況。一般建議采取memset将dest的全部元素用null填充,如:memset(dest,0,8)(8為從dest起始位址開始前8個位置填充null,dest可以為字元指針和數組名)。

  注意:char* p="abc"; char ch[5]; sizeof(p)為4(包含null)(有些編譯器不行),sizeof(ch)為5。

  這樣:

  如果n = source串長度,與strcpy一緻。 

  如果n = dest串長度,[0,src串長度]處存放于dest字串,(src串長度, dest串長度]處存放NULL。 

  2)source串長度>dest串長度 

  如果n =dest串長度,則dest串沒有NULL字元,會導緻輸出會有亂碼。如果不考慮source串複制完整性,可以将dest最後一字元置為NULL。

  是以,一般把n設為dest(含null)的長度(除非将多個source複制到dest中)。當n=dest串長度時,定義dest為字元數組,因為這時沒有null字元拷貝。

4. const char *c_str();

  c_str()函數是c++中屬于string類的成員函數,傳回一個指向正規C字元串的指針常量, 内容與本string串相同.(其實它指向的是string對象内部真正的char緩沖區),是以傳回const,以防止使用者的修改。

  注意:(如下這段内容參考 http://www.cnblogs.com/qlwy/archive/2012/03/25/2416937.html)

  1)c_str()生成一個const char*指針,指向以空字元終止的數組,但這個數組的資料是臨時的(如前所述,其實它指向的是string對象内部真正的char緩沖區),當有一個改變這些資料的成員函數被調用後,其中的資料就會失效。看下例:

const char* c;
string s="1234";
c = s.c_str(); 
cout<<c<<endl; //輸出:1234
s="abcd";
cout<<c<<endl; //輸出:abcd      

  

  上面如果繼續用c指針的話,導緻的錯誤将是不可想象的。就如:1234變為abcd。是以應該把原string的資料複制到使用者自己可以管理的記憶體中。怎麼把資料複制出來呢?這就要用到strcpy等函數(推薦)。

//const char* c; //①
//char* c;       //②
//char c[20]; 
char* c=new char[20];
string s="1234";
//c = s.c_str(); 
strcpy(c,s.c_str());
cout<<c<<endl; //輸出:1234
s="abcd";
cout<<c<<endl; //輸出:1234      

  

  注意:不能再像①一樣将c聲明為const char*類型的指針了,因為c要接收strcpy的值;也不能②所示,使用了未初始化的局部變量“c”,運作會出錯的 。

  2)c_str()傳回一個客戶程式可讀不可改的指向字元數組的指針,不需要手動釋放或删除這個指針。

  3) data():與c_str()類似,但是傳回的數組不以空字元終止。

 5. int strcmp ( const char * str1, const char * str2 );

  比較兩個字元串數組的大小。規則如下:

  ①字元串1小于字元串2,strcmp函數傳回一個負值;

  ②字元串1等于字元串2,strcmp函數傳回零;

  ③字元串1大于字元串2,strcmp函數傳回一個正值;

  實際比較時,按字元位置從小到大依次比較各個字元;直到第一對不相等的字元,或者任何一個字元數組遇到''。注意:

 

if("ABC">"DEF")   /*錯誤的字元串比較*/

if(strcmp("ABC","DEF")   /*正确的字元串比較*/      

6.  char *strcat(char *dest,char *src);

  strcat用于連接配接字元串,傳回結果的頭指針。

  參考如下兩篇文章:

  http://www.cnblogs.com/clover-toeic/p/3885181.html

  http://blog.csdn.net/smf0504/article/details/52055971