獲取字符串長(zhǎng)度的幾個(gè)常用方法

版本記錄

版本號(hào) 時(shí)間
V1.0 2017.08.30

前言

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

使用strlen函數(shù)

字符串的長(zhǎng)度可以使用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ù)求出的字符串長(zhǎng)度為有效長(zhǎng)度,即不包含字符串末尾結(jié)束符‘\0’,因而返回的結(jié)果是第一個(gè)'\0'前字符元素的個(gè)數(shù)。


使用sizeof()計(jì)算

字符串的長(zhǎng)度還可以使用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í)這么寫是錯(cuò)誤的,這里輸出的不是字符串的長(zhǎng)度,而是指針變量占有空間的大小。32位操作系統(tǒng)對(duì)應(yīng)4字節(jié),所以結(jié)果是4,64位系統(tǒng)對(duì)應(yīng)8字節(jié),返回的結(jié)果就是8。

接著看下面這個(gè)例子

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

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

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

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

int main(int argc, const char * argv[])
{
    /**
        字符串長(zhǎng)度的計(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)了。

后記

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • PHP常用函數(shù)大全 usleep() 函數(shù)延遲代碼執(zhí)行若干微秒。 unpack() 函數(shù)從二進(jìn)制字符串對(duì)數(shù)據(jù)進(jìn)行解...
    上街買菜丶迷倒老太閱讀 1,382評(píng)論 0 20
  • 版權(quán)聲明:本文為 gfson 原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處。注:作者水平有限,文中如有不恰當(dāng)之處,請(qǐng)予以指正,萬分感謝...
    gfson閱讀 3,187評(píng)論 0 6
  • 總結(jié)了一些開發(fā)中常用的函數(shù): usleep() //函數(shù)延遲代碼執(zhí)行若干微秒。 unpack() //函數(shù)從二進(jìn)制...
    ADL2022閱讀 476評(píng)論 0 3
  • 最全的iOS面試題及答案 iOS面試小貼士 ———————————————回答好下面的足夠了-----------...
    zweic閱讀 2,721評(píng)論 0 73
  • 在C語言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,403評(píng)論 0 2