問:C++中定義字符型數組時'\0'是不是也占一位?是不是定義char a[5],只能有4個字符?那計算字符長度時又否忽略'\0'?
答:
C++中定義字符型數組時'\0'是不是也占一位?是不是定義char a[5],只能有4個字符,(是的,如果你把這個字符數組看成一個字符串的話,這里應該是最多4個字符,)
那計算字符長度時又否忽略'\0'? (是的)
解釋:
定義char a[5],則說明,a是個字符數組,在內存中占五個字節空間
如果用a來存儲字符串,則最多只能有4個有效字符,必須給\0留個空間。
計算a的長度與a的大小是不同的概念
a按字符串來算長度是從a這個地址開始,計數到\0字符,這之間的字符個數是字符串a的長度。
一般常用strlen()函數來獲取字符串長度。
計算a的大小用sizeof命令,sizeof(a)得到的是a在內存中占的字節數!
字符串與字符數組不要混為一談。它們相同在形式上,區別就在,字符串一定有\0結束符,而數組不需要!
什么是字符串?就是以雙引號引起來的數據才叫字符串。字符數組可以存儲字符串!
示例:
1 char szbufA[5]="ABCD"; 2 //szbufA表達式的值:0x0035f9bc "ABCD" 3 4 //szbufC[5]="ABCD1"; //編譯報錯 error C2440: “=”: 無法從“const char [6]”轉換為“char” 5 6 char szbufB[5]; 7 szbufB[0]='a'; 8 szbufB[1]='b'; 9 szbufB[2]='c'; 10 szbufB[3]='d'; 11 szbufB[4]='e'; 12 //szbufB表達式的值:0x0035f9ac "abcde燙燙燙燙燙藺BCD" 13 14 int na = sizeof(szbufA);//na=5 15 int naa = strlen(szbufA);//naa=4 16 int nb = sizeof(szbufB);//nb=5 17 int nbb = strlen(szbufB);//nbb=20
從以上代碼的1-12行代碼中可以看出,定義字符數組時,使用字符串初始化只能使用長度為數組大小(n-1)的字符串。使用大於等於字符數組長度的字符串初始化會報錯。
從以上代碼第2、12和17的代碼中可以看出,使用五個字符分別給szbufB字符數組賦值,導致szbufB數組沒有'\0'結束符,szbufB數組的表達式值是錯誤的,szbufB的長度不是5,而是20了。
把szbufB字符數組拷貝到其他字符數組或者字符串地址時,拷貝的內容可能會出錯。因為szbufB數組沒有'\0'結束符。
總結:定義字符數組保存字符串時,字符數組大小= 字符串長度 + 1。sizeof數組名,是計算數組占用字節的大小。strlen數組名,是計算數組中字符串的長度(不包括'\0'結束符)。