C語言中strlen求字串長度,求字元陣列長度(空字元,數字0,字元0,陣列部分初始化)
如下字元陣列or字串,用strlen函式求長度各是多少?
char * p = "abc" 與 char a[] = "abc"兩種形式並不同,這在我另一篇博文中有提到。
char * str1 = "abc";
char * str2 = "ab\0c";
char * str3 = "ab\\0c";
char * str4 = "abc0c";
char arr0[5] = {'1', '2', '3', '4', '5'};
char arr1[5] = {'1', '2', '3', '4', '\0'};
char arr2[5] = {'1', '2', '3', '4', 0};
char arr3[5] = {'0', '0', '0'};
char arr4[5] = {0, 'a', 'b'};
char arr5[5] = {'a', '\0', 'b'};
char arr6[5] = {'a', 0, 'b'};
答案為 3 2 5 5未知4 4 3 0 11
當然sizeof(arrx) x代表0 - 6 的結果都為5
sizeof(arrx[y]) x為0 - 6. y為 0 - 4都為1.
sizeof(strx) x為 1 - 4都為4.(32為平臺下,指標大小為4位元組)
為什麼呢? 首先,在字串中‘\0’代表空字元,‘\0’ASCII值為0. 所以可認為‘/0’ == 0.
strlen函式工作機理:函式從第一個字元開始計算字串中字元數,直到遇到空字元,然後返回空字元前字元總個數。
接下來分析:
char * str1 = "abc";
3 字串"abc",沒什麼好說的,系統自動在末尾加上空字元。 所以為3.
char * str2 = "ab\0c";
2 第一個字串"abc"相當於 "abc\0",既然系統識別出了最後的空字元,說明系統把‘\0’當成一個整體,一個字元'\0'。而不是按照'\'與'0'兩個字元對待。 所以遇到ab後的‘\0’時,strlen函式認為已經到了字串的結尾。
char * str3 = "ab\\0c";
5 此時第二個斜槓被第一個斜槓轉義,“\\0“相當於字元'\\'(第二個'\'被第一個'\'轉義為“列印” '\' 而不是把第二個 '\' 當成一個 轉義字元 和 0 合為'\0')與字元'0'。
char * str4 = "abc0c"
5 雖然說過 '/0' == 0 可在這裡, 字串中0, 代表字元'0' 而不是數字0. 因此不終止strlen計算個數。
char arr0[5] = {'1', '2', '3', '4', '5'};(這是一個字元陣列,他裡面存放的並不是字串(無'\0'),只是一系列字元)
因為最後無空字元,所以strlen一直尋找直到遇到第一個空字元,此時結果不可預知(幸運的是,記憶體中'\0'還是蠻多的)
char arr1[5] = {'1', '2', '3', '4', '\0'};
4 因為第五個元素為'\0'
char arr2[5] = {'1', '2', '3', '4', 0};
4 因為數字0 == ‘\0’
char arr3[5] ={'0', '0', '0'};
3 前三個元素為字元‘0’ != 數字0 ('\0'),因為部分初始化,陣列剩下元素被設定為數字0,因此第四個元素為0 == ‘\0’。終止,所以為3.(陣列宣告後不初始化,裡面值為隨機值,部分初始化後,未被初始化部分自動被初始化為0)
char arr[4] = {0, 'a', 'b'};
0
char arr[5] = {'a', '\0', 'b'}
1
char arr[6] = {'a', 0, 'b'};
1
我們再來看看"abc\0d"這個字串,系統在d字元後還加空字元嗎? 它裡面已經有空字元了啊!?
系統還是會加的,因為系統只負責在引號中最後一個字元結尾加一個空字元,然後根據你佔用的空間大小以位元組為單位給字串開闢空間,它才不管你字串裡面有沒有空字元(按照約定,空字元代表字串結束,所以平時不要在字串內部加空字元)
我們可以通過sizeof關鍵字來驗證,sizeof以位元組為單位返回所佔空間大小,包括空字元, 而strlen是計算長度直到遇到空字元停止,對他來說遇到空字元就停止工作。
如果系統在"abc\0d"末尾加空字元,那麼sizeof("abc\0d")的返回值應該為6(‘\0’當一個字元對待),不加則為5。經驗證為6,說明系統在最後是加空字元的(也說明了字串中的空字元並不起終止字串儲存的作用,系統只是把'\0'當字串中一個字元對待)。
sizeof(“abc\0”) == 5
sizeof("abc\0\0") == 6
sizeof("abc\0d") == 6
還想到一種驗證方法,針對"abc\0d"實現一個函式,函式遇到第二個空字元返回包括第二個空字元在內的字串字元總個數,即可以驗證系統在這個字串後還加沒加空字元。(如果加程式返回6,如果不加則不是6,是一個隨機值,or程式直接出錯)。
#include <stdio.h>
int MyFun (const char * str);
int main (void)
{
int n = MyFun("abc\0d");
printf ("%d\n", n);
return 0;
}
int MyFun (const char * str)
{
int i = 0;
int flag = 0;
while (1)
{
i++;
if ( *str++ == '\0' )
{
flag++;
}
if ( flag == 2 )
{
return i;
}
}
}
相關文章
- 字元陣列的長度字元陣列
- 獲取C/C++字串、字元陣列長度C++字串字元陣列
- C語言求其字元陣列的長度C語言字元陣列
- c語言的strlen函式計算字元陣列長度不對C語言函式字元陣列
- C語言中如何求一個陣列的長度C語言陣列
- ORACLE字元列長度語義Oracle字元
- 求給定字串的平均字元長度字串字元
- C語言中,當計算字元陣列長度時,用sizeof 和strlen 的原理及兩者的區別C語言字元陣列
- Java 定義長度為 0 的陣列 / 空陣列Java陣列
- C語言(字元陣列)C語言字元陣列
- c語言字元陣列C語言字元陣列
- 求陣列長度的兩種方法,以及區別(strlen sizeof)陣列
- 字元陣列與字串字元陣列字串
- c語言中計算陣列長度的方法C語言陣列
- go 語言中的 rune,獲取字元長度Go字元
- js將陣列轉字元,字元轉回陣列JS陣列字元
- C++陣列長度C++陣列
- 用字元型陣列來存放字元字元陣列
- 字串指標與字元陣列 (轉)字串指標字元陣列
- Ruby小記--字串轉字元陣列字串字元陣列
- ABAP字串操作 擷取字元長度 取位數字串字元
- 第七章——字串(不定長度字元)字串字元
- C語言如何計算陣列的長度C語言陣列
- 得到字串 位元組 長度 中文 兩個字元 英文一個字元字串字元
- sizeof 和 strlen 計算陣列大小和長度詳解陣列
- JS判斷字串長度(英文佔1個字元,中文漢字佔2個字元)JS字串字元
- C++獲取陣列的長度C++陣列
- gcc 0長陣列學習GC陣列
- Java如何將字串轉換為字元陣列?Java字串字元陣列
- js使用指定字元將字串分割生成陣列JS字元字串陣列
- 如何擷取指定長度字串區分漢字和字元字串字元
- JavaScript 擷取字串右邊指定長度字元JavaScript字串字元
- c語言獲取陣列長度的函式C語言陣列函式
- C語言獲得陣列長度的函式C語言陣列函式
- 求字串連續字元數量字串字元
- 字串的長度,是字元數量,還是位元組數量?字串字元
- 查詢陣列中出現次數大於陣列長度一半的數字陣列
- 求字串中不含重複字元的最長子串字串字元