轉自:http://blog.csdn.net/kstrwind/article/details/8036555
/*sddfasdfasdfweimoyaozhuanni轉了個球地*/
C語言字符串長度的計算是編程時常用到的,也是求職時必考的一項。
C語言本身不限制字符串的長度,因而程序必須掃描完整個字符串後才能確定字符串的長度。
在程序裏,一般會用strlen()函數或sizeof來獲取一個字符串的長度,但這2種方法獲取的字符串的長度其實是不一樣,我們用如下函數進行測試:
- void test6()
- {
- char s1[20] = "hello world";
- char s2[20] = {'h','e','l','l','0',' ','w','o','r','l','d','\0'};
- char s3[] = "hello\0 world";
- char s4[] = {'h','e','l','l','0','\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));
- }
注意,該函數裏面定義了4個字符串,基本數據都是“hello world",但需要注意的是,字符串s1和s2給定了字符串數組的大小爲20,然後使用2種方式進行賦值;字符串s3和s4是s1和s2對比的字符串,區別就是s3和s4字符串中間插入了一個'\0'。該函數運行的結果如下:
從運行結果可以看出,strlen()函數和sizeof求字符串長度需要注意下面幾點:
1. strlen函數求得的字符串長度是從字符串第一個元素到第一個'\0'之間元素的個數(如果字符串中間有'\0',則結果不是整個字符串的長度),同時不包括該'\0'
所以:如果malloc的時候且用strlen求的字符串長度的話,需要+1;
2. sizeof求得的結果是存儲該字符串的變量佔用的空間大小,因而一定會包括'\0'.若'\0'後還有空餘的空間,也會包含到結果裏面
解釋(與2種求值方式的實現原理有關):
1. strlen()的一種實現就是遍歷字符串,遇到'\0'就終止,因而返回的結果是第一個'\0'前字符元素的個數
2. sizeof 常用來求變量佔用內存空間的大小,因而它返回的是存儲字符串的變量所佔用的內存空間大小,用來求字符串的長度,只在特定情況下可行,即字符數組剛好被一個字符串佔滿。