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
{
...........
}