版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.08.30 |
前言
最近一直在寫OC和Swift,已經(jīng)好幾年沒有寫C的東西了虑绵,今天突然被一個人問懵逼了防泵,頓時感覺一身冷汗蚀之,真的難道這么簡單的問題我都記錯了嗎?回到家以后痛定思痛捷泞,感覺還是沒事的時候?qū)懸稽c東西足删,這樣子才不會慢慢遺忘,下面我們就從最簡單的獲取C字符串的長度開始吧肚邢。
使用strlen函數(shù)
字符串的長度可以使用strlen
函數(shù)進行計算壹堰。
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()計算
字符串的長度還可以使用sizeof()
進行計算。
有的人可能這么做
const char *str = "Hello world";
unsigned int length = sizeof(str);
printf("length = %d\n", length);
看輸出結(jié)果
length = 8
Program ended with exit code: 0
其實這么寫是錯誤的响蕴,這里輸出的不是字符串的長度谆焊,而是指針變量占有空間的大小。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é)果里面。 - 當在函數(shù)內(nèi)部使用sizeof()求解由函數(shù)的形參傳入的字符數(shù)組的長度時续膳,得到的結(jié)果為指針的長度改艇,既對應(yīng)變量的字節(jié)數(shù),而不是字符串的長度坟岔,此處一定要小心谒兄。
- 總結(jié)一句就是sizeof計算的是變量的大小,而strlen計算的是字符串的長度社付,前者不受字符'\0'影響承疲,后者以'\0'作為長度判定依據(jù)邻耕。
- sizeof用來求字符串的長度,只在特定情況下可行燕鸽,即字符數(shù)組剛好被一個字符串占滿赊豌。
自定義函數(shù)實現(xiàn)
可以自定義函數(shù)進行字符串長度的計算。
#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;
}
這里還要注意:
- 從上面的結(jié)果可以看出來绵咱,它將中間的空格還有后面的
\0
計算在內(nèi)了。
后記
今天非常郁悶熙兔,被這個小點給弄錯了悲伶,以前寫的C都忘記了,非常郁悶住涉,所以寫一篇文章以自警麸锉,絕不犯錯第二次。