版本記錄
版本號(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ò)第二次。