天天看點

C++中strlen與sizeof處理字元數組和字元指針

strlen與sizeof的功能都是擷取指定對象的長度。strlen()是一個函數,該函數的格式為

size_t strlen(  

   const char *str  

);

其中,參數類型是const char*,strlen()函數的參數指定了在記憶體的某個起始位置,從該起始位置到碰到的第一個字元串結束符’\0’為止,期間的記憶體長度為該函數的傳回值;而sizeof()是一個操作符,該操作符的格式為

sizeof unary-expression  

sizeof ( type-name )

該操作符的傳回值是能夠容納該操作的操作數的位元組大小。

1 處理字元數組

1.1 處理未指定元素個數的數組

在如下代碼中:

char char_array[] = {'1', '2', '3', '4', '5', '\0'};

int ret_strlen = strlen(char_array);

int ret_sizeof = sizeof(char_array);

此時,ret_strlen的值是5,而ret_sizeof的值是6。

1.2 處理制定元素個數的數組

在如下代碼中,指定的數組元素個數為10:

char char_array[6] = {'\0'};

char_array[0] = '1';

char_array[1] = '2';

char_array[2] = '3';

int ret_strlen = strlen(char_array);

int ret_sizeof = sizeof(char_array);

此時,ret_strlen的值是3,而ret_sizeof的值是6。

2 處理字元指針

在如下代碼中

char *pchar = "12345";

int ret_strlen = strlen(pchar);

int ret_sizeof1 = sizeof(pchar);

int ret_sizeof2 = sizeof(*pchar);

此時,ret_strlen的值是5,ret_sizeof1的值是4,ret_sizeof2的值是1。因為sizeof操作符的傳回值是操作數是pchar,而pchar的類型是指針,指針類型的長度為4個位元組,是以ret_sizeof1的值是4,而*pchar表示pchar指針所指向的第一個位元組的内容,其類型為char,是以ret_sizeof2的值是1。

3 實戰

在“CSDN”的論壇中,有朋友說下面的代碼總是報錯:

char a[99] = {0};

//輸入數組a中的元素,輸入的個數少于99個

for(int i=0;i<(sizeof(a[i]));i++) //周遊數組a

{

...........

}

for循環的目的是周遊數組a,而從前面分析我們知道,要想擷取數組a的大小,無論使用strlen還是sizeof,其參數或者操作數都應該是數組本身,而不是數組中的某個值。是以,需要将for循環中的sizeof(a[i])改為sizeof(a)。

另外,由于輸入字元的個數少于數組的大小,使用sizeof擷取到的是數組本身的大小即99,而是用strlen()函數擷取到的則是數組中元素的個數,從提高程式運算效率的角度出發,for循環的代碼應改為

for(int i=0;i<(strlen(a[i]));i++) //周遊數組a

{

...........

}

繼續閱讀