數組、字符串長度的計算

常見的計算長度的函數有兩個,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

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