1. 程式人生 > >srtlen實現以及與sizeof的比較

srtlen實現以及與sizeof的比較

signed 對象 字節 常量 包含 長度 ons 頭文件 object

這裏僅為個人整理,大部分來自百科

一、strlen函數

strlen所作的僅僅是一個計數器的工作,它從內存的某個位置(可以是字符串開頭,中間某個位置,甚至是某個不確定的內存區域)開始掃描,直到碰到第一個字符串結束符‘\0‘為止,然後返回計數器值(長度不包含‘\0‘)。

1、用法:

針對碰到第一個字符串結束‘\0‘為止的兩點說明:

(1)見下例:

1 char a[10]={\0};
2 cout<<strlen(a)<<endl;  //結果為0

從開始到遇到一個‘\0‘為止。

(2)見下例:

1 char a[10];
2 cout<<strlen(a)<<endl;  //
此處結果不定

從開始到遇到一個‘\0‘為止。

2、函數實現

 1 /*遞歸版*/
 2 size_t strlen(const char *pStr)
 3 {
 4     assert(pStr !=nullptr);
 5     if(*pStr !=\0)
 6     {
 7         return 1+strlen(++pStr);
 8     }
 9     else
10         return 0;
11 }
12 
13 /*非遞歸版*/
14 size_t strlen(const char *pStr)
15 {
16     assert(pStr !=nullptr);
17 size_t psize=0; 18 while(*pStr !=\0) 19 { 20 psize++; 21 pStr++; 22 } 23 rturn psize; 24 }

二、sizeof

sizeof是C/C++中的一個操作符(operator),簡單的說其作用就是返回一個對象或者類型所占的內存字節數。sizeof( )返回的是變量聲明後所占的內存數,不是實際長度。

1、這是一個依賴編譯系統的值,頭文件為stddef.h中,一般定義為:

1 typedef unsigned int size_t;

2、語法

1 sizeof(object);     //sizeof(對象);
2 sizeof(type_name);  //sizeof(類型);
3 sizeof object;      //sizeof 對象;和第一行比少一個括號

三、strlen函數和sizeof的區別

(1)sizeof不是函數,僅僅是一個取字節運算符,strlen是函數;

(2)sizeof可以用類型做參數,strlen只能用char*做參數,且必須是以‘‘\0‘‘結尾的;

(3)數組做sizeof的參數不退化,傳遞給strlen就退化為指針了;

更多見百科。

區別舉例:

(1)針對靜態數組:

1 char str[20]="0123456789";
2 int a=strlen(str);      //a=10
3 int b=sizeof(str);      //b=20;

(2)針對指針

1 char* ss = "0123456789";    //ss是指向字符串常量的字符指針
2 sizeof(ss)      //結果 4,sizeof 獲得的是一個指針的值所占的空間,應該是長整型的,所以是4
3 sizeof(*ss)     //結果 1, *ss是第一個字符 其實就是獲得了字符串的第一位‘0‘ 所占的內存空間,是char類型的,占了 1 位
4 strlen(ss)= 10  //如果要獲得這個字符串的長度,則一定要使用 strlen

註:從對比知,若想獲得一個字符串的長度,一定要使用strlen

srtlen實現以及與sizeof的比較