聊聊strlen函式與sizeof的區別

2021-10-10 23:30:35 字數 1613 閱讀 6832

對於 strlen 和 sizeof,雖然從表面上看它們都可以求字串的長度,但二者卻存在著許多不同之處及本質區別。

strlen

strlen 是乙個函式,它用來計算指定字串 str 的長度,但不包括結束字元(即 null 字元)。其原型如下面的**所示:

size_t strlen

(char

const

* str)

;

也正因為 strlen 是乙個函式,所以需要進行一次函式呼叫,呼叫示例如下面的**所示:

char aarr=

"test"

;

/*用strlen()求長度*/

printf

("aarr的長度=%d\n"

,strlen

(aarr)

);

很顯然,上面示例**的執行結果為 4(因為不包括結束字元 null)。這裡需要特別注意的是,函式 strlen 返回的是乙個型別為 size_t 的值,從而有可能讓程式導致意想不到的結果,如下面的示例**所示:

/*判斷一*/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 不同,它的引數可以是陣列、指標、型別、物件、函式等,如下面的示例**所示:

char aarr=

"test"

;/*用sizeof求長度*/

printf

("aarr的長度=%d\n"

,sizeof

(aarr)

);

相對於函式 strlen,這裡的示例**執行結果為 5(因為它包括結束字元 null)。同時,對 sizeof 而言,因為緩衝區已經用已知字串進行了初始化,其長度是固定的,所以 sizeof 在編譯時計算緩衝區的長度。 sizeof也正是由於在編譯時計算,因此 sizeof 不能用來返回動態分配的記憶體空間的大小。

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...