字符串的sizeof長度及strlen長度


在C/C++中,字符串是以零('\0')結尾的。比如,對於下面的字符串:

"hello" 
 
在最后一個字符'd'后面,還有一個我們肉眼看不見的'\0'字符,作為該字符串的結束符。所以,"Hello"其在內存中的存儲形式為:

'H' 'e' 'l' 'l' 'o' '\0'

最后有一個我們看不見的'\0'。明白了字符串的結尾方式,那么如何計算字符串的長度呢?比如:

例題1:
char str1[]="12345678";
char str2[]={'1','2','3','4','5','6','7','8'};
char str3[]={'1','2','3','\0','5','6','7','8'};
sizeof(str1)=?
sizeof(str2)=?
sizeof(str3)=?
strlen(str1)=?
strlen(str2)=?
strlen(str3)=?

分析:
str1是一個字符數組,由字符串"12345678"進行初始化。由於"12345678"含有一個結尾字符'\0',所以str1數組共有9個字符。 因此sizeof(str1)=9。

str2也是一個字符數組,它的長度由'1','2','3','4','5','6','7','8'8個字符初始化,並沒有指明零字符。 因此sizeof(str2)=8。

str3同樣由8個字符初始化,因此sizeof(str3)=8。


strlen函數只計算字符串中不含零的字符個數。因此:strlen(str1)=8。

而由於str2中最后一個字符不包含零,所以,str2不是一個有效的字符串, 因此strlen(str2)不確定。

而對於字符數組str3,在第4個字符為'\0',所以作為一個字符串,在此處結尾。所以strlen(str3)=3。

答案:
sizeof(str1)=9
sizeof(str2)=8
sizeof(str3)=8
strlen(str1)=8
strlen(str2)=無結束字符0,所以字符串溢出,不確定
strlen(str3)=3

 

例題2:實現strlen方法。

分析:既然字符串是以'\0'結尾的,那么實現strlen也就很簡單了,直接從左往右遍歷字符串,遇到'\0'就退出。
size_t strlen (const char * str)
{
    const char *eos = str;
    while( *eos++ )  
         ;
    return( eos - str - 1 );
}


那么,有沒有不是以零結尾的字符串表示方法呢?實際上是有的。比如:UNICODE_STRING, ANSI_STRING。

這兩種類型的字符串表示方法, 就不是以零結尾的了,而是以首地址和有效長度來定義字符串。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM