對於 strlen 和 sizeof,雖然從表面上看它們都可以求字串的長度,但二者卻存在著許多不同之處及本質區別。
strlen
strlen 是乙個函式,它用來計算指定字串 str 的長度,但不包括結束字元(即 null 字元)。其原型如下面的**所示:
也正因為 strlen 是乙個函式,所以需要進行一次函式呼叫,呼叫示例如下面的**所示:size_t strlen
(char
const
* str)
;
char aarr=
"test"
;
很顯然,上面示例**的執行結果為 4(因為不包括結束字元 null)。這裡需要特別注意的是,函式 strlen 返回的是乙個型別為 size_t 的值,從而有可能讓程式導致意想不到的結果,如下面的示例**所示:/*用strlen()求長度*/
printf
("aarr的長度=%d\n"
,strlen
(aarr)
);
從表面上看,上面的兩個判斷表示式完全相等,但實際情況並非如此。其中,判斷表示式一沒什麼問題,程式也能夠完全按照預想的那樣工作;但判斷表示式二的結果就不一樣了,它將永遠是真,這是為什麼呢?/*判斷一*/if(
strlen
(x)>=
strlen
(y))
/*判斷二*/if(
strlen
(x)-
strlen
(y)>=0)
原因很簡單,因為函式 strlen 的返回結果是 size_t 型別(即無符號整型),而 size_t 型別絕不可能是負的。因此,語句「if(strlen(x)-strlen(y)>=0)」將永遠為真。
同樣,就算表示式中同時包含了有符號整數和無符號整數,還是有可能產生意想不到的結果,如下面的**所示:
很顯然,判斷表示式二的結果還是永遠是真,其原因與上面相同。/*判斷一*/if(
strlen
(x)>=5)
/*判斷二*/if(
strlen
(x)-
5>=0)
sizeof
sizeof是c/c++中的乙個運算子,而不是乙個函式,其作用是返回乙個物件或者型別在記憶體中所占用的位元組數。與函式 strlen 不同,它的引數可以是陣列、指標、型別、物件、函式等,如下面的示例**所示:
相對於函式 strlen,這裡的示例**執行結果為 5(因為它包括結束字元 null)。同時,對 sizeof 而言,因為緩衝區已經用已知字串進行了初始化,其長度是固定的,所以 sizeof 在編譯時計算緩衝區的長度。 sizeof也正是由於在編譯時計算,因此 sizeof 不能用來返回動態分配的記憶體空間的大小。char aarr=
"test"
;/*用sizeof求長度*/
printf
("aarr的長度=%d\n"
,sizeof
(aarr)
);
sizeof與strlen函式的區別
strlen 是函式,而sizeof是算符 strlen函式,用來求字串的長度,sizeof函式是用來求指定變數或變數型別 運算元 等所占用記憶體的大小且儲存大小由運算元的型別決定。若運算元具有型別char unsigned char或signed char,其結果等於1。ansi c正式規定字元型...
strlen函式實現
函式功能 統計字串中的字元個數。很簡單,直接設乙個變數,並遍歷即可。int strlen const char str 但如果不讓使用中間變數呢?函式執行過程中不占用記憶體基本不可能,除非都使用了暫存器。不使用中間變數 只是說程式設計師不能顯示的申請記憶體而已,即不能有區域性變數或者動態記憶體申請。...
strlen函式編寫
0x00 strlen函式原型 extern unsigned int strlen char s 標頭檔案 string.h 格式 strlen 字元陣列名 功能 計算給定 字串的 unsigned int型 長度,不包括 0 在內 說明 返回s的長度,不包括結束符null。0x01 mystrl...