1. 程式人生 > >c/c++中sizeof()、strlen()、length()、size()詳解和區別

c/c++中sizeof()、strlen()、length()、size()詳解和區別

c/c++中獲取字串長度。有以下函式:size()、sizeof() 、strlen()、str.length();


一、陣列或字串的長度:sizeof()、strlen()
1、sizeof():返回所佔總空間的位元組數
(1)、對於整型字元型陣列
(2)、對於整型或字元型指標
2、strlen():返回字元陣列或字串所佔的位元組數
(1)、針對字元陣列
(2)、針對字元指標


sizeof(...)是運算子,其值在編譯時即計算好了,引數可以是陣列、指標、型別、物件、函式等。它的功能是:獲得保證能容納實現所建立的最大物件的位元組大小。由於在編譯時計算,因此sizeof不能用來返回動態分配的記憶體空間的大小。


strlen(...)是函式,要在執行時才能計算。引數必須是字元型指標(char*)。當陣列名作為引數傳入時,實際上陣列就退化成指標了。它的功能是:返回字串的長度。該字串可能是自己定義的,也可能是記憶體中隨機的,該函式實際完成的功能是從代表該字串的第一個地址開始遍歷,直到遇到結束符'\0'。返回的長度大小不包括'\0'。


strlen(char*)函式求的是字串的實際長度,它求得方法是從開始到遇到第一個'\0',如果你只定義沒有給它賦初值,這個結果是不定的,它會從aa首地址一直找下去,直到遇到'\0'停止。


c/c++ strlen(str)和str.length()和str.size()都可以求字串長度。
其中str.length()和str.size()是用於求string類物件的成員函式
strlen(str)是用於求字元陣列的長度,其引數是char*。



舉例:




1)char* ss = "0123456789";


sizeof(ss)為4,ss是指向字串常量的字元指標,sizeof 獲得的是指標所佔的空間,則為4
sizeof(*ss)為1,*ss是第一個char字元,則為1


2)char ss[] = "0123456789";


sizeof(ss)為11,ss是陣列,計算到'\0'位置,因此是(10+1)
sizeof(*ss)為1,*ss是第一個字元


3)char ss[100] = "0123456789";


sizeof(ss)為100,ss表示在記憶體中預分配的大小,100*1
strlen(ss)為10,它的內部實現用一個迴圈計算字串的長度,直到'\0'為止。



4)int ss[100] = "0123456789";


sizeof(ss)為400,ss表示在記憶體中預分配的大小,100*4
strlen(ss)錯誤,strlen引數只能是char*,且必須是以'\0'結尾



5)char[] a={'a','b','c'};
sizeof(a)的值應該為3。


char[] b={"abc"};
sizeof(b)的值應該是4。


若string str={'a','b','c','\0','X'};
那麼sizeof(str)為5,strlen(str)為3。




sizeof()、strlen()兩者區別:
1)sizeof操作符的結果型別是size_t,它在標頭檔案中typedef為unsigned int型別。 
該型別保證能容納實現所建立的最大物件的位元組大小。 


2)sizeof是運算子,strlen是函式。 


3)sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以''\0''結尾的。 
sizeof還可以用函式做引數,比如: 
short f(); 
printf("%d\n", sizeof(f())); 
輸出的結果是sizeof(short),即2。 


4)陣列做sizeof的引數不退化,傳遞給strlen就退化為指標了。 


5)大部分編譯程式 在編譯的時候就把sizeof計算過了 是型別或是變數的長度。這就是sizeof(x)可以用來定義陣列維數的原因 
char str[20]="0123456789"; 
int a=strlen(str); //a=10; 
int b=sizeof(str); //而b=20; 


6)strlen的結果要在執行的時候才能計算出來,用來計算字串的長度,不是型別佔記憶體的大小。 


7)sizeof後如果是型別必須加括弧,如果是變數名可以不加括弧。這是因為sizeof是個操作符不是個函式。 


8)當使用了一個結構型別或變數時, sizeof 返回實際的大小, 當使用一靜態地空間陣列, sizeof 返回全部陣列的尺寸。 sizeof 操作符不能返回被動態分配的陣列或外部的陣列的尺寸 


二、string中length()和size()





c++中的size()和length()沒有區別


如:


string str="0123456789";
cout <<"str.length()="<<str.length()<<endl;//結果為10
cout <<"str.size()="<<str.size()<<endl;//結果為10



 

為了相容,這兩個函式一樣。 length()是因為沿用C語言的習慣而保留下來的,string類最初只有length(),引入STL之後,為了相容又加入了size(),它是作為STL容器的屬性存在的,便於符合STL的介面規則,以便用於STL的演算法。 string類的size()/length()方法返回的是位元組數,不管是否有漢字。