常見的計算長度的函數有兩個,sizeof()和strlen(),但是,它們之間的差別還是很大的。
sizeof():主要負責計算數組的長度;
strlen():主要負責計算字符串的長度。
(1)sizeof():數組佔用字節除以數組類型所佔字節,結果爲數組元素個數
使用方法:sizeof(數組名)/ sizeof(數組類型名)
(2)strlen():strlen,求字符串有效長度
方法:strlen(字符數組名) //結果爲字符數組有效字符長度,不包括末尾的’\0′
注意:當數組作爲函數參數傳遞時,數組名代表的是數組的首址,而非數組內容,故無法使用sizeof和strlen;
所以,在傳址時,應提供2個參數:1、數組名,代表數組首地址;2、數組元素個數,以便確定傳遞的次數。
下面來舉個例子說明一下,不同情況下sizeof()的用法:
#include<iostream>
using namespace std;
void Sum(int array[ ])
{
cout<<“sizeof(array)=”<<sizeof(array)<<endl;
}
void main()
{
int a[ ]={1,2,3,4,5,6,7,8,9,10};
cout<<“sizeof(a)=”<<sizeof(a)<<endl;
Sum(a);
}
運算結果爲:sizeof(a)=10 sizeof(array)=4
看到這樣的結果,是不是感覺很奇怪?同樣的數組,在不同的位置,輸出卻不一樣。
分析:當數組作爲函數參數傳遞時,數組名代表的是數組的首址,即指針,而非數組內容。如果傳遞整個數組,會導致棧溢出的。
所以在主函數中使用sizeof計算出的是準確的數組長度。而在調用函數中,由於傳遞的數組不再是數組本身,而是其地址,所以用sizeof計算出的,實際上是數組地址的長度,這時的sizeof(array),實際上是sizeof(int)。
因此,要想計算實際的數組長度,還是在主函數中求好,要是在調用時想用,可以作爲參數傳遞過去嘛。
再來看看strlen()的用法:
若數組爲存儲字符串的字符數組,即以雙引號括起來的字符串整體初始化的字符數組
例如:char a[]=”abcdefg”或者char a[]={“abcdefg”}
則所求得的長度爲字符數組的長度,而不是對應的字符串的長度,要求字符串的長度還需要減1。
即:字符串長度=字符數組長度-1。
原因:存儲字符串的字符數組末尾有一個’\0’字符,需要去掉它。
對於char a[]=”abcdefg”
sizeof(a)/sizeof(a[0])=8,要求字符串長度的話應該減1。
注意:sizeof()在計算時,包括末尾的’\0′
strlen(a)=7,表示的就是字符串的長度。
但對於char a[]={’a’,’b’,’c’,’d’,’e’,’f’,’g’}
sizeof(a)/sizeof(a[0])=7