strlen所作的僅僅是一個計數器的工作,它從記憶體的某個位置(可以是字元串開頭,中間某個位置,甚至是某個不確定的記憶體區域)開始掃描,直到碰到第一個字元串結束符'\0'為止,然後返回計數器值(長度不包含'\0')。
基本介紹
- 中文名:strlen
- 頭檔案:string.h(C)或cstring(C++)
- 格式:strlen(字元指針表達式)
- 功能:計算給定字元串的長度
- 實質:C/C++語言函式
- 返回值:給定字元串(不包括“\0”)長度
函式原型
extern unsigned int strlen(char *s);
size_t strlen(const char *string);
typedef unsigned int size_t;
TCHAR.H routine _UNICODE & _MBCS not defined_MBCS defined_UNICODE defined_tcslen
strlen | strlen | wcslen |
_tcsclen | strlen | _mbslen |
程式舉例
//#include<bits/stdc++.h>//C++萬能頭檔案#include<iostream>#include<cstring>#include<cstdio>using namespace std;int main(void){ ios::sync_with_stdio(false); char s[10000]="Hello, World!"; cout << s << "has" << strlen(s) << "character(s)." << endl; //printf("%s has %d character(s).",s,strlen(s)); //putchar(); return 0;}
Hello, World! has 13 character(s).
區別sizeof
樣例1
#include<iostream>#include<cstring>using namespace std;int main(void){ char aa[100000]; cout<<strlen(aa)<<endl; return 0;} //這個樣例的結果是不定的
樣例2
#include<iostream>#include<cstring>using namespace std;int main(void){ char aa[200]={'\0'}; cout<<strlen(aa)<<endl; return 0;}/*這個樣例結果為0而sizeof()返回的是變數聲明後所占的記憶體數,不是實際長度,此外sizeof不是函式,僅僅是一個取位元組運算符,strlen是函式。*/
樣例3
#include<iostream>#include<cstring>using namespace std;int main(void){ char aa[200]="Hello, World!"; cout<<strlen(aa)<<endl; return 0;}/*這個樣例的結果為13*/
樣例4
#include<iostream>#include<cstring>using namespace std;int main(void){ char aa[200]="hello"; cout << strlen(aa) << endl; return 0;}//這個樣例的結果為5
sizeof(aa); //返回200
int a[10]; sizeof(a) //返回40 (根據語言int型 c/c++由編譯器決定是兩個或四個 java 是四個)
#include<iostream>#include<cstdio>using namespace std;int main(void){ short f(); //printf("%d\n",sizeof(f())); cout << sizeof(f()) << endl; return 0;}//輸出的結果是sizeof(short),即2。
char str[20000]="0123456789";long a=strlen(str); //a=10;int b=sizeof(str); //而b=20000;
fun(char [8])fun(char [])
//都等價於fun(char *)
fun(unsiged char *p1,int len){ unsigned char* buf = new unsigned char[len+1]; memcpy(buf,p1,len);}
char str[20000]="0123456789";int a=strlen(str); //a=10; >>>> strlen 計算字元串的長度,以結束符 0x00 為字元串結束。int b=sizeof(str); //而b=20000; >>>> sizeof 計算的則是分配的數組 str[20000] 所占的記憶體空間的大小,不受裡面存儲的內容改變。
- 上面是對靜態數組處理的結果,如果是對指針,結果就不一樣了
char* ss = "0123456789";sizeof(ss) //結果 4>>>>ss是指向字元串常量的字元指針,sizeof 獲得的是一個指針的值所占的空間,是char*類型,所以是4sizeof(*ss) //結果 1>>>> *ss是第一個字元 其實就是獲得了字元串的第一位'0' 所占的記憶體空間,是char類型的,占了 1 位strlen(ss)= 10 //>>>> 如果要獲得這個字元串的長度,則一定要使用 strlen//sizeof返回對象所占用的位元組大小. 正確//strlen返回字元個數. 正確
- 在使用strlen時,有一個很特別的情況,就是數組名到指針蛻變
char Array[2000] = {'0'};sizeof(Array) == 2000;char *p = Array;strlen(p) == 1;//sizeof(p)結果為4//在傳遞一個數組名到一個函式中時,它會完全退化為一個指針
第一個例子
/*1*/ #include<iostream>#include<cstring>using namespace std;int main(void){ char* ss = "0123456789"; cout << sizeof(ss) << endl; //結果 4 ===》ss是指向字元串常量的字元指針 cout << sizeof(*ss) << endl; //結果 1 ===》*ss是第一個字元 //大部分編譯程式 在編譯的時候就把sizeof計算過了 是類型或是變數的長度 //這就是sizeof(x)可以用來定義數組維數的原因 return 0;}
/*2*/ #include<iostream>#include<cstring>using namespace std;int main(void){ char ss[] = "0123456789"; cout << sizeof(ss) << endl; //結果 11 ===》ss是數組,計算到\0位置,因此是10+1 cout << sizeof(*ss) << endl; //結果 1 ===》*ss 是第一個字元 return 0;}
/*3*/ #include<iostream>#include<cstring>using namespace std;int main(void){ char q[]="abc"; char p[]="a\n"; cout << sizeof(q) << endl; cout << sizeof(p) << endl; cout << strlen(q) << endl; cout << strlen(p) << endl; return 0;}//結果是 4 3 3 2
第二個例子
#include<iostream>#include<cstring>using namespace std;class X{ int i; int j; char k;};X x;int main(void){ cout<<sizeof(X)<<endl; //結果 12 ===》記憶體補齊 cout<<sizeof(x)<<endl; //結果 12 同上 return 0;}
第三個例子
#include<iostream>#include<cstring>using namespace std;struct O{ int a,b,c,d,e,f,g,h;};int main(void){ char szPath[MAX_PATH]/*如果在函式內這樣定義,那么sizeof(szPath)將會是MAX_PATH,但是將szPath作為虛參聲明時(void fun(char szPath[MAX_PATH]),sizeof(szPath)卻會是4(指針大小)*/ char const * static_string = "Hello"; cout << sizeof(static_string) << endl; //是 sizeof 一個指針,所以在 32bit system 是 4 char stack_string[] = "Hello"; cout << sizeof(stack_string) << endl; //是 sizeof 一個數組,所以是 sizeof(char[6]) char * string = new char[6]; strncpy(string,"Hello",6"); cout << sizeof(string) << endl; //是 sizeof 一個指針,所以還是 4。和第一個不同的是,這個指針指向了動態存儲區而不是靜態存儲區。//不管指針指向的內容在什麼地方,sizeof 得到的都是指針的大小 system("PAUSE"); return 0;}
#include<stdio.h>#include<assert.h>typedef unsigned int u_int;u_int Mystrlen(const char*str){u_int i;assert(str!=NULL);for(i=0;str[i]!='\0';i++); return i;}
unsigned int strlen(const char*str){assert(str!=NULL);unsignedint len=0;while((*str++)!='\0') len++;return len;}
unsigned int strlen(const char*str){assert(str);const char*p=str;while(*p++!=0);return p-str-1;}
unsigned int strlen(const char*str){assert(str);if(*str==0) return 0;else return(1+strlen(++str));}
/***strlen-Findthelengthofastring*@s:Thestringtobesized*/size_t strlen(const char*s){const char*sc;for(sc=s;*sc!='\0';++sc)/*nothing*/;return sc-s;}
size_t strlen(const char * str){ const char *cp = str; while(*cp++) return(cp-str-1);}