srtlen實現以及與sizeof的比較
阿新 • • 發佈:2017-08-07
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的比較