strlen

strlen

C/C++語言函數
strlen所作的是一個計數器的工作,它從内存的某個位置(可以是字符串開頭,中間某個位置,甚至是某個不确定的内存區域)開始掃描,直到碰到第一個字符串結束符'\0'為止,然後返回計數器值(長度不包含'\0')。
  • 中文名:strlen
  • 外文名:
  • 别名:
  • 格式:strlen(字符指針表達式)
  • 實質:C/C++語言函數

原型

extern unsigned int strlen(char *s);

在Visual C++6.0中,原型為size_tstrlen(const char *string),其中size_t實際上是unsigned int,在VC6.0中可以看到這樣的代碼:typedef unsigned int size_t。

功能:計算字符串s的(unsigned int型)長度,不包括'0'在内

說明:返回s的長度,不包括結束符NULL。

舉例:

舉例1:(在Visual C++6.0中運行通過)

#include

#include

int main(void)

char*s="GoldenGlobalView";

printf("%shas%dchars",s,strlen(s));

getchar();

return0;

區别sizeof

strlen()函數計算的是字符串的實際長度,遇到第一個'0'結束。如果你隻定義沒有給它賦初值,這個結果是不定的,它會從首地址一直找下去,直到遇到'0'停止。而sizeof返回的是變量聲明後所占的内存數,不是實際長度,此外sizeof不是函數,僅僅是一個操作符,strlen()是函數。n

⒈sizeof操作符的結果類型是size_t,它在頭文件中typedef為unsigned int類型。

⒉sizeof是取字節運算符(關鍵字),strlen是函數。

⒊sizeof可以用類型做參數,strlen隻能用char*做參數,且必須是以'0'結尾的。

⒋數組做sizeof的參數不退化,傳遞給strlen就退化為指針了。

⒌大部分編譯程序在編譯的時候就把sizeof計算過了是類型或是變量的長度。這就是sizeof(x)可以用來定義數組維數的原因。

6.strlen的結果要在運行的時候才能計算出來,是用來計算字符串的長度,不是類型占内存的大小。

7.sizeof後如果是類型必須加括弧,如果是變量名可以不加括弧。這是因為sizeof是個操作符不是個函數。

⒏當适用了于一個結構類型時或變量,sizeof返回實際的大小,當适用一靜态地空間數組,sizeof歸還全部數組的尺寸。

⒐數組作為參數傳給函數時傳的是指針而不是數組,傳遞的是數組的首地址,n

第一個例子

char*ss="0123456789";

sizeof(ss)結果4===》ss是指向字符串常量的字符指針

sizeof(*ss)結果1===》*ss是第一個字符

大部分編譯程序在編譯的時候就把sizeof計算過了是類型或是變量的長度

這就是sizeof(x)可以用來定義數組維數的原因

char str[20]="0123456789";

int a=strlen(str);//a=10;

int b=sizeof(str);//而b=20;

char ss[]="0123456789";

sizeof(ss)結11===》ss是數組,計算到0位置,因此是10+1

sizeof(*ss)結果1===》*ss是第一個字符

char ss[100]="0123456789";

sizeof(ss)結果是100===》ss表示在内存中的大小100×1

strlen(ss)結果是10===》strlen是個函數,内部實現是用一個循環計算到0之前為止

int ss[100]="0123456789";

sizeof(ss)結果400===》ss表示在内存中的大小100×4

strlen(ss)錯誤===》strlen的參數隻能是char*且必須是以'0'結尾的

char q[]="abc";

char p[]="an";

sizeof(q),sizeof(p),strlen(q),strlen(p);

結果是 4 3 3 2

第二個例子

class X{ int i; int j; char k;};X x;

cout<

cout<

第三個例子

char szPath[MAX_PATH]

如果在函數内這樣定義,那麼sizeof(szPath)将會是MAX_PATH,但是将szPath作為虛參聲明時(void fun(char szPath[MAX_PATH])),sizeof(szPath)卻會是4(指針大小)

還有一位網友的說明也很好:

其實理解sizeof隻需要抓住一個要點:

程序存儲分布有三個區域:棧、靜态和動态。能夠從代碼直接操作的對象,包括任何類型的變量、指針,都是在棧上的;動态和靜态存儲區是靠棧上的指針來間接操作的。sizeof操作符,計算的是對象在棧上的投影體積;記住這個就很多東西都很清楚了。

char const * static_string="Hello";

sizeof(static_string) sizeof 一個指針,所以在 32bit system是4

char stack_string[]="Hello";

sizeof(stack_string)是sizeof 一個數組,所以是 6 * sizeof(char)

char * string=new char[6];

strncpy(string,"Hello",6");

sizeof(string)是sizeof一個指針,所以還是4。和第一個不同的是,這個指針指向了動态存儲區而不是靜态存儲區。

不管指針指向的内容在什麼地方,sizeof得到的都是指針的棧大小

C++中對引用的處理比較特殊;sizeof一個引用得到的結果是sizeof一個被引用的對象的大小;所以

struct O{ int a,b,c,d,e,f,g,h;};int main(){ O & r = *new O; cout << sizeof(O) << endl; // 32 cout << sizeof r << endl;//也是32system("PAUSE");}

r引用的是整個的O對象而不是指向O的指針,所以sizeof r的結果和sizeof O完全相同。

strlen()函數計算的是字符串的實際長度,遇到第一個'0'結束。如果你隻定義沒有給它賦初值,這個結果是不定的,它會從首地址一直找下去,直到遇到'0'停止。而sizeof返回的是變量聲明後所占的内存數,不是實際長度,此外sizeof不是函數,僅僅是一個操作符,strlen()是函數。n

上一篇:澄海實驗學校

下一篇:Hate

相關詞條

相關搜索

其它詞條