C語言中文網 目錄
首頁 > 編程筆記 > C語言筆記 > 字符串 閱讀:33,763

strlen函數與sizeof的區別,C語言strlen與sizeof的區別詳解

對于 strlen 和 sizeof,相信不少程序員會混淆其功能。雖然從表面上看它們都可以求字符串的長度,但二者卻存在著許多不同之處及本質區別。

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

size_t strlen(char const* str);

也正因為 strlen 是一個函數,所以需要進行一次函數調用,調用示例如下面的代碼所示:
char sArr[] = "ILOVEC";
/*用strlen()求長度*/
printf("sArr的長度=%d\n", strlen(sArr));
很顯然,上面示例代碼的運行結果為 6(因為不包括結束字符 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 是一個單目運算符,而不是一個函數。與函數 strlen 不同,它的參數可以是數組、指針、類型、對象、函數等,如下面的示例代碼所示:
char sArr[] = "ILOVEC";
/*用sizeof求長度*/
printf("sArr的長度=%d\n", sizeof(sArr));
相對于函數 strlen,這里的示例代碼運行結果為 7(因為它包括結束字符 null)。同時,對 sizeof 而言,因為緩沖區已經用已知字符串進行了初始化,其長度是固定的,所以 sizeof 在編譯時計算緩沖區的長度。也正是由于在編譯時計算,因此 sizeof 不能用來返回動態分配的內存空間的大小。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo