獲取字符串長度的幾個常用方法

版本記錄

版本號 時間
V1.0 2017.08.30

前言

最近一直在寫OC和Swift,已經(jīng)好幾年沒有寫C的東西了,今天突然被一個人問懵逼了,頓時感覺一身冷汗,真的難道這么簡單的問題我都記錯了嗎?回到家以后痛定思痛,感覺還是沒事的時候?qū)懸稽c(diǎn)東西,這樣子才不會慢慢遺忘,下面我們就從最簡單的獲取C字符串的長度開始吧。

使用strlen函數(shù)

字符串的長度可以使用strlen函數(shù)進(jìn)行計(jì)算。

const char *str = "Hello world";
unsigned int length = strlen(str);
printf("length = %d\n", length);

下面看輸出結(jié)果

length = 11
Program ended with exit code: 0

這里要注意:strlen()函數(shù)求出的字符串長度為有效長度,即不包含字符串末尾結(jié)束符‘\0’,因而返回的結(jié)果是第一個'\0'前字符元素的個數(shù)。


使用sizeof()計(jì)算

字符串的長度還可以使用sizeof()進(jìn)行計(jì)算。

有的人可能這么做

    const char *str = "Hello world";
    unsigned int length = sizeof(str);
    printf("length = %d\n", length);

看輸出結(jié)果

length = 8
Program ended with exit code: 0

其實(shí)這么寫是錯誤的,這里輸出的不是字符串的長度,而是指針變量占有空間的大小。32位操作系統(tǒng)對應(yīng)4字節(jié),所以結(jié)果是4,64位系統(tǒng)對應(yīng)8字節(jié),返回的結(jié)果就是8。

接著看下面這個例子

char s1[20] = "hello world";
char s2[20] = {'h','e','l','l','o',' ','w','o','r','l','d','\0'};
char s3[] = "hello\0 world";
char s4[] = {'h','e','l','l','o','\0',' ','w','o','r','l','d','\0'};

printf("%d\t%d\t%d\t%d\n",strlen(s1),strlen(s2),strlen(s3),strlen(s4));
printf("%d\t%d\t%d\t%d\n",sizeof(s1),sizeof(s2),sizeof(s3),sizeof(s4));

下面看輸出結(jié)果

11  11  5   5
20  20  13  13
Program ended with exit code: 0

所以,這里要注意:

  • sizeof求得的結(jié)果是存儲該字符串的變量占用的空間大小,因而一定會包括'\0',若'\0'后還有空余的空間,也會包含到結(jié)果里面。
  • 當(dāng)在函數(shù)內(nèi)部使用sizeof()求解由函數(shù)的形參傳入的字符數(shù)組的長度時,得到的結(jié)果為指針的長度,既對應(yīng)變量的字節(jié)數(shù),而不是字符串的長度,此處一定要小心。
  • 總結(jié)一句就是sizeof計(jì)算的是變量的大小,而strlen計(jì)算的是字符串的長度,前者不受字符'\0'影響,后者以'\0'作為長度判定依據(jù)。
  • sizeof用來求字符串的長度,只在特定情況下可行,即字符數(shù)組剛好被一個字符串占滿。

自定義函數(shù)實(shí)現(xiàn)

可以自定義函數(shù)進(jìn)行字符串長度的計(jì)算。

#include <stdio.h>
#include <string.h>
#include <time.h>

int main(int argc, const char * argv[])
{
    /**
        字符串長度的計(jì)算
     */
    const char *str = "Hello world";
    unsigned int length = strLength(str);
    printf("length = %d\n", length);
    
}

int strLength(char *str)
{
    int i = 0;
    while ( str[i++] != '\0')
        ;
    return i;
}

這里還要注意:

  • 從上面的結(jié)果可以看出來,它將中間的空格還有后面的\0計(jì)算在內(nèi)了。

后記

今天非常郁悶,被這個小點(diǎn)給弄錯了,以前寫的C都忘記了,非常郁悶,所以寫一篇文章以自警,絕不犯錯第二次。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容