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

weixin_34124651發表於2017-08-30

版本記錄

版本號 時間
V1.0 2017.08.30

前言

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

使用strlen函式

字串的長度可以使用strlen函式進行計算。

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

下面看輸出結果

length = 11
Program ended with exit code: 0

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


使用sizeof()計算

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

有的人可能這麼做

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

看輸出結果

length = 8
Program ended with exit code: 0

其實這麼寫是錯誤的,這裡輸出的不是字串的長度,而是指標變數佔有空間的大小。32位作業系統對應4位元組,所以結果是4,64位系統對應8位元組,返回的結果就是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));

下面看輸出結果

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

所以,這裡要注意:

  • sizeof求得的結果是儲存該字串的變數佔用的空間大小,因而一定會包括'\0',若'\0'後還有空餘的空間,也會包含到結果裡面。
  • 當在函式內部使用sizeof()求解由函式的形參傳入的字元陣列的長度時,得到的結果為指標的長度,既對應變數的位元組數,而不是字串的長度,此處一定要小心。
  • 總結一句就是sizeof計算的是變數的大小,而strlen計算的是字串的長度,前者不受字元'\0'影響,後者以'\0'作為長度判定依據。
  • sizeof用來求字串的長度,只在特定情況下可行,即字元陣列剛好被一個字串佔滿。

自定義函式實現

可以自定義函式進行字串長度的計算。

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

int main(int argc, const char * argv[])
{
    /**
        字串長度的計算
     */
    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;
}

這裡還要注意:

  • 從上面的結果可以看出來,它將中間的空格還有後面的\0計算在內了。

後記

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

3691932-b4281eb3300dc74b.jpg

相關文章