1樓:我是一個麻瓜啊
1. strlen 是函式,sizeof 是運算子。
2. strlen 測量的是字元的實際長度,以'\0' 結束。而sizeof 測量的是字元的分配大小。
比如:char str[20] = "hello";
printf("strlen: %d\n", strlen(str));
printf("sizeof: %d\n", sizeof(str));
結果顯示為:
strlen: 5
sizeof: 20
3.但是在子函式中,size of 會把從主函式中傳進來的字元陣列當作是指標來處理。指標的大小又是由機器來決定,而不是人為的來決定的。
#include
void size_of(char str)
printf("sizeof:%d\n", sizeof(str));
int main()
char str[20] = "hello";
size_of(str);
return 0;
結果顯示為sizeof:4
4.我們知道字元陣列的初始化一次性賦值,也可以逐個賦值。可以指定陣列的大小,也可以不指定陣列長度。
#include
#include
int main()
char str1 = "hello";
char str2 = ;
char str3 = ;
printf("str1:%s\n",str1);
printf("str2:%s\n",str2);
printf("str3:%s\n",str3);
printf("str1:%d\n", strlen(str1));
printf("str2:%d\n", strlen(str2));
printf("str3:%d\n", strlen(str3));
return 0;
結果顯示為:
str1:hello
str2:hello
str3:hellohello
str1:5
str2:5
str3:10
5.strlen的結果要在執行的時候才能計算出來,是用來計算字串的長度,不是型別佔記憶體的大小。而大部分編譯程式在編譯的時候就把sizeof計算過了是型別或是變數的長度。
6.sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以''\0''結尾的。
2樓:匿名使用者
首先說明一點,char型別佔一個位元組,所以sizeof(char)是1,這點要理解
str1是一個指標,只是指向了字串"absde"而已。所以sizeof(str1)不是字串佔的空間也不是字元陣列佔的空間,而是一個字元型指標佔的空間。所以sizeof(str1)=sizeof(char*)=4,在c/c++中一個指標佔4個位元組
str2是一個字元型陣列。c/c++規定,對於一個陣列,返回這個陣列佔的總空間,所以sizeof(str2)取得的是字串"absde"佔的總空間。"absde"中,共有a b s d e \0六個字元,所以str2陣列的長度是6,所以sizeof(str2)=6*sizeof(char)=6
str3已經定義成了長度是8的陣列,所以sizeof(str3)為8
str4和str2類似,'0' '1' ... '9'加上'\0'共11個字元,所以ss佔的空間是8
總之,對於指標,sizeof操作符返回這個指標佔的空間,一般是4個位元組;而對於一個陣列,sizeof返回這個陣列所有元素佔的總空間。char*與char容易混淆,一定要分清,而且char*="aaa"的寫法現在不被提倡,應予以避免
而strlen不區分是陣列還是指標,就讀到\0為止返回長度。而且strlen是不把\0計入字串的長度的。
3樓:吉祥二進位制
strlen:是c標準庫中的字串函式,用於統計字元的個數。
sizeof:是c語言中的運算子,確切的說是一個編譯時運算子,用於統計型別或者變數所佔的記憶體位元組數。示例,以32位系統為例。
char *str = "hello";
strlen(str); //它的值是5,因為hello這個字串有5個字元
sizeof(str); //它的值是4,因為char *是一個指標型別,它佔4個位元組。
sizeof("hello"); //它的值是5,是因為hello有5個字元,每一個字元佔1個位元組。
int a[2] = ;
sizeof(a); //它的值是8,因為a中有2個int型變數,每個int型佔4個位元組,所以8位元組
4樓:買越晁曉燕
sizeof(str),其中str為字串的頭指標,指標佔的空間為4位元組,即為4
strlen(str),計算str的有效長度,hello長度為5,輸出為5;
sizeof(s),s是一個字串,此時,sizeof計算的是這個字串的長度,除了hello佔5個位元組以外,還有一個位元組的'\0'表示字串結束,總共為6;
希望樓主能明白
5樓:風凱定士原
sizeof和strlen沒有任何相似的地方。
strlen計算的是字串長度的函式,直到遇到'\0'結束,結果不包括'\0'在內。
sizeof是一個運算子,在編譯的時候就計算結果了,可以確定一個變數、型別、陣列佔用的記憶體空間。
6樓:管迪勵素華
sizeof可以是對於一個型別,如:int,short,char,或者一個結構,能夠得到它的位元組數,也能得到陣列的位元組數。還有sizeof不是一個函式
strlen是對於字串的,從第一個元素開始,直到遇到'\0'為止,如果你這麼寫是錯誤的
inta[3]=;
printf("%d",
strlen(a));
7樓:匿名使用者
1. sizeof 操作符的結果型別size_t,它在標頭檔案中typedef為unsigned int型別: typedef unsigned int size_t.
2. sizeof是是長度運算子, 獲得資料型別或是變數的長度,如果是資料型別,則返回資料型別大小,如果是用陣列,則返回陣列所佔空間大小,strlen是計算字串長度的函式,返回的是實際串長度,以char* 作引數 ,且必須是以'\0'結尾。3.
sizeof在編譯的時候就把計算過,strlen的結果要在執行的時候才能計算出來。4. 陣列做長度運算子sizeof的引數不退化。
陣列做函式strlen的引數就退化為指標了,因為陣列作為引數傳給函式時傳的是指標而不是陣列,傳遞的是陣列的首地址。
8樓:鐵芹藩凌青
sizeof()求的是位元組數,不同型別的資料在記憶體中的位元組數是不一樣的,對於字串來說,也就是字元的個數,因為一個字元佔1個位元組的記憶體,當然這裡包括字串最後的'\0'字元。
而strlen()求的是字串的長度,也就是字元的個數,不包括最後的'\0'字元
9樓:匿名使用者
strlen,是判斷字串的長度,即:string length,在這裡是good的長度,長度是4.
sizeof,是判斷型別的長度,在這裡是陣列的長度,在這裡是str資料的長度,長度是10。
10樓:匿名使用者
首先要對字串要了解。字串最後有個隱藏的字元'\0',標識該字串結束。
'\n'是換行符號,只是一個字元而已。
sizeof 計算字串長度時候會把最後的 '\0' 算進去,而strlen 不會。
所以一般結果就是 sizeof 計算出來的長度 比 strlen的長度要多1個位元組。
例如:這個sizeof("hello")=6,而strlen("hello")=5。
但是sizeof 在計算陣列的時候,是計算這個陣列的最大長度,而不是陣列內部資料的長度。
所以問題中的 strlen結果是5,而sizeof結果是10 。'\n'也佔一個位元組。
除此之外,還要注意,當sizeof後面帶一個指標的時候,實際上是計算指標的長度,一般32位裝置
指標長度是4個位元組。而strlen依然是計算指標指向的長度。
例如:char *a="hello";
sizeof(a)=4 <=-====因為a是指標,結果是指標的大小
strlen(a)=5 <*****=依然是5
11樓:匿名使用者
我們能常在用到 sizeof 和 strlen 的時候,通常是計算字串陣列的長度
從這個例子可以看得很清楚:har str[11]="0123456789";//注意這裡str大小因該大於等於11,應考慮'\0'在內,否則編譯器會報錯
int a=strlen(str); //a=10; >>>> strlen 計算字串的長度,以結束符 0x00 為字串結束。
int b=sizeof(str); //而b=11; >>>> sizeof 計算的則是分配的陣列 str[11] 所佔的記憶體空間的大小,不受裡面儲存的內容改變。
12樓:上天
一、sizeof
sizeof(...)是運算子,在標頭檔案中typedef為unsigned int,其值在編譯時即計算好了,引數可以是陣列、指標、型別、物件、函式等。
它的功能是:獲得保證能容納實現所建立的最大物件的位元組大小。
由於在編譯時計算,因此sizeof不能用來返回動態分配的記憶體空間的大小。實際上,用sizeof來返回型別以及靜態分配的物件、結構或陣列所佔的空間,返回值跟物件、結構、陣列所儲存的內容沒有關係。
二、strlen
strlen(...)是函式,要在執行時才能計算。引數必須是字元型指標(char*)。當陣列名作為引數傳入時,實際上陣列就退化成指標了。
它的功能是:返回字串的長度。該字串可能是自己定義的,也可能是記憶體中隨機的,該函式實際完成的功能是從代表該字串的第一個地址開始遍歷,直到遇到結束符null。
返回的長度大小不包括null。
【擴充套件資料】:
1、具體而言,當引數分別如下時,sizeof返回的值表示的含義如下:
陣列——編譯時分配的陣列空間大小;
指標——儲存該指標所用的空間大小(儲存該指標的地址的長度,是長整型,應該為4);
型別——該型別所佔的空間大小;
物件——物件的實際佔用空間大小;
函式——函式的返回型別所佔的空間大小。函式的返回型別不能是void。
2、舉例:
(1)、char arr[10] = "what?";
int len_one = strlen(arr);
int len_two = sizeof(arr);
cout << len_one << " and " << len_two << endl;
輸出結果為:5 and 10
點評:sizeof返回定義arr陣列時,編譯器為其分配的陣列空間大小,不關心裡面存了多少資料。strlen只關心儲存的資料內容,不關心空間的大小和型別。
(2)、char * parr = new char[10];
int len_one = strlen(parr);
int len_two = sizeof(parr);
int len_three = sizeof(*parr);
cout << len_one << " and " << len_two << " and " << len_three << endl;
輸出結果:23 and 4 and 1
點評:第一個輸出結果23實際上每次執行可能不一樣,這取決於parr裡面存了什麼(從parr[0]開始知道遇到第一個null結束);第二個結果實際上本意是想計算parr所指向的動態記憶體空間的大小,但是事與願違,sizeof認為parr是個字元指標,因此返回的是該指標所佔的空間(指標的儲存用的是長整型,所以為4);第三個結果,由於*parr所代表的是parr所指的地址空間存放的字元,所以長度為1。
【參考資料】:
1.sizeof操作符的結果型別是size_t,它在標頭檔案中typedef為unsigned int型別。
該型別保證能容納實現所建立的最大物件的位元組大小。
2.sizeof是算符,strlen是函式。
3.sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以''\0''結尾的。
sizeof還可以用函式做引數,比如:
short f();
printf("%d\n", sizeof(f()));
輸出的結果是sizeof(short),即2。
4.陣列做sizeof的引數不退化,傳遞給strlen就退化為指標了。
c語言中strlen與sizeof有什麼區別
strlen 是返回所定義字串的長度,而sizeof是用來取得變數或型別所占用的記憶體空間大小的。 strlen 是返回字串的長度。而sizeof,卻是用來取得變數或型別所占用的記憶體大小的。這個a陣列的字串長度為4 末尾的 0是不計入字串長度的 但a是10個單位的char型,它占用的記憶體空間是1...
strlen和sizeof有什麼區別
妖精王的祝福 區別 一 定義不同 sizeof是運算子,在標頭檔案中typedef為unsigned int,其值在編譯時即計算好了,引數可以是陣列 指標 型別 物件 函式等。2 它的功能是 獲得保證能容納實現所建立的最大物件的位元組大小。具體而言,當引數分別如下時,sizeof返回的值表示的含義如...
c語言中sizeof 和strlen 用法上有什麼區別呢
延霞月 兩者都是返回位元組數,具體講前者返回的是位元組數,而後者返回的是字元數 其次,sizeof返回的數量包括最後的結束符 0 而strlen則沒有。 sizeof是操作符,不是函式。它後面的 並不是必須的,沒有歧意時就不必寫上了。sizeof操作符計算的是系統為它後面的變數或型別名分配的空間大小...