1樓:匿名使用者
sizeof計算出來的是所佔位元組數,strlen算出來的是字元數,不包括'\0'
a1[10]有10個char所佔的空間,char佔1個位元組,所以a1[10]佔10個位元組,但是只有4個字元。
a2沒有指定大小,大小是根據後面的元素個數自動計算的,所以是3;字元數也是3
a3也沒有指定大小,用乙個字串來初始化,字串都是以'\0'結尾的,因此字串"sdfg"裡面其實包含了's','d','f','g','0'5個字元,所以佔了5個位元組;但是strlen不計算'\0',所以是4個字元。
a4[4]同理,4個位元組,3個字元。
a5[4]同理,4個位元組,4個字元//
但是執行的時候是11個字元,這點我暫時沒明白。思考下,可能是這個原因:strlen的引數是字串,也就是必須到'\0'才結束。
a5裡面沒有'\0',因此strlen會往後找,直到找到'\0'為止。
void main()是可以的,用雙引號包含標頭檔案也是可以的。
2樓:匿名使用者
這是我執行出來的結果,有的地方不同電腦會不同,後面會提到。
sizeof是計算位元組數,字元變數是1個位元組,所以有幾個字元變數就是幾個位元組。
strlen是計算字串長度,不過字串末尾的\0是不會算進去的。
我逐一說吧。
對於a1,a1定義長度是10,所以佔位元組數也就是10,你初始化了4個元素,後六個就是0,也就是\0,因為\0的值就是0。所以a1作為乙個字串,實際是。
"abcd\0\0\0\0\0\0",所以字串長度是4。
對於a2,你用的是不說明陣列長度並且用逐一元素初始化的初始化方法,這樣你初始化了幾個元素,這個陣列的長度就是多少。所以長度是3,但是a2的3個元素都被佔滿了,沒有\0,所以作為字串來講編譯器找不到結束符,就會出現一些亂七八糟的東西,你可以用puts(a2)來檢視一下就知道了。不同電腦結果會不一樣。
對於a3和a4,用字串來初始化字元陣列的時候,只要長度足夠或者預設長度,編譯器會自動加上乙個\0做結束符。
a5和a2差不多,也是沒有\0導致的,同樣可以用puts(a5)來查詢。
所謂字串a,就是從a的位址開始往後,到第乙個\0之間的內容。
3樓:網友
strlen是計算從開始到'\0'之間的位元組數的,不包括尾部的那個結束符。
對a1求strlen是依賴編譯器把未指定的即從a[4]起元素置為0,否則肯定出錯。
而a2就遇到了這個問題,位元組流的莫非沒有0,strlen繼續跑,跑到a3**遇到0才停止。已經越界了。
a3就是編譯器給分配了足夠的容納字元的空間,以及,還有乙個額外的位元組容納0。
a4的寫法靠自己計算,參考a3就知道4位元組全用了。
a5那個和a2一樣越界了,但是究竟是在**遇到 0是不確定的,這種bug是程式崩潰的一種原因。
回頭說sizeof,這個是能夠在編譯時刻根據變數型別確定的實際儲存空間大小。
有的是你設定的,如明確給出陣列下標,有的是編譯器設定的,例如陣列不寫下標值而是根據初始元素的個數自動計算。
c語言中sizeof與strlen的區別是什麼
4樓:匿名使用者
一、指代不同。
1、sizeof:用於獲取字串的長度,是處理字串的重要工具。
2、strlen:所作的是乙個計數器的工作。
二、規則不同。
1、sizeof:可用於任何變數名、型別名或常量值,當用於變數名(不是陣列名)或常量時,不需要用圓括號。
2、strlen:從記憶體的某個位置(可以是字串開頭,中間某個位置,甚至是某個不確定的記憶體區域)開始掃瞄,直到碰到第乙個字串結束符'\0'為止,然後返回計數器值。
三、用法不同。
1、sizeof:sizeof( type_name );sizeof( 型別 );編譯時起作用,而不是執行時。
2、strlen:extern unsigned int strlen(char *s);返回s的長度,不包括結束符null。
5樓:小丁創業
區別如下:
1、指代上的區別。
(1)sizeof:用來獲取字串長度的導引,是處理字串的重要工具。
(2)strlen:做的是乙個計數器。
2、用法上的區別。
(1)sizeof:sizeof( type_name );sizeof(type); 在編譯時有效,而不是在執行時有效。
(2)strlen:extern unsigned int strlen(char *s); 返回s的長度,不包含終止符null。
3、規則上的區別。
(1)sizeof:可用於任何變數名,型別名或常量值。 當用於變數名(不是陣列名)或常量時,不需要括號。
(2)strlen:從記憶體的某個特定位置開始掃瞄(可以是字串的開頭,中間的某個位置,甚至是不確定的儲存區域),直到第乙個字串結束字元'\ 0'為止 ,然後返回計數器值。
6樓:倒霉熊
sizeof獲得是所佔的位元組數,所分配的空間的位元組數。
strlen獲得是長度(實際字元的個數)。
例如: char a[5]="abc";
sizeof(a) 等於5,因為分配了5個位元組的空間。
而strlen(a)等於3,這是其實際字元的個數。
7樓:
sizeof 是被測試型別佔用位元組的大小。
strlen是以\0為結束符的字串的串長度(不含結束符)比如吧:
char *p = 0123456789abcdef";
char str = 0123456789abcdef";
char str2[100] =0123456789abcdef";
sizeof(p) 只是 4(或8與作業系統有關,32位系統應當只是4)
strlen(p) 是16個長度。
sizeof(str) 是17
strlen(str) 是16
sizeof(str2) 是100
strlen(str2) 是16
c語言sizeof和strlen的區別
8樓:匿名使用者
char name="nike" ;
sizeof(name)=5
如果陣列定義成int,就不能用scanf("%s",name);來輸入字串了,因為這兩個型別是不同的。%s只能輸入char字串資料。
9樓:網友
sizeof運算子計算的是運算元型別的大小,只是陣列會乘以長度而已,和傳入的具體內容無關。
要強行輸出5的話那就sizeof("nike")吧……
要強行可以計算補了0長度的那就strlen+1
10樓:萢萢
\0 只在char型陣列中才有。
c語言中strlen怎麼用,c語言strlen函式問題
strlen為c語言庫函式,包含於string.h中,作用為計算乙個字串 字元陣列 中元素的個數,即從陣列頭部計數,直到遇到字串結束符 0為止,計數結果不包括 0.其宣告為 unsigned int strlen char s 比如定義字串 char p this is for testing 呼叫...
c語言中sizeof的意思是什麼下面這道題的答案是什麼,請解
上面這麼多朋友都在亂說,不怕誤導別人啊?vc環境下的答案是124 tc環境下是64,因為int在vc下佔4位元組,而在tc下佔2位元組 sizeof struct date 12 year,month和day每個佔4位元組,所以結構體today佔用3 4 12位元組 sizeof m 4 a佔4位元...
sizeof計算虛函式和虛擬繼承類大小時的問題
這的確涉及了記憶體對齊,還有虛繼承vbptr指標,但是太複雜了,樓主弄明白了告訴我一聲。虛函式和虛繼承的大小問題 乙個簡單程式 我用的vc6,結果分別是8,20,32.a的大小為8的原因是位元組對齊,即虛函式表指標佔4位元組,k佔3位元組,然後編譯器補了1位元組,將類的大小湊成4的倍數,以方便32位...