2012-08-13 95 views
0

我有這樣的代碼:C++的strlen(CH)和sizeof(CH)strlen的

int main() 
{ 
    char ch[15]; 
    cout<<strlen(ch)<<endl; //7 
    cout<<sizeof(ch)<<endl; //15 
    return 0; 
} 

爲什麼strlen(ch)給出不同的結果,即使它是空的char陣列?

+9

它不是空的。它裝載了未初始化的垃圾。 – Mysticial 2012-08-13 08:13:08

回答

5

ch是局部變量,局部變量未初始化。所以你假設它是一個空字符串是不正確的。它充滿了垃圾。這僅僅是一個共同發病率,一個\0字符在後7個亂碼發現,因此strlen返回7.

你可以不喜歡這些,以確保空與字符串

char ch[15]={0}; 
ch[0]='\0`; 
strcpy(ch,""); 

這裏有一個類似的線程更多閱讀

Variable initialization in C++

+0

靜態局部變量是默認初始化的;)還是被初始化了值?該死的,我從來沒有得到這個權利。 – fredoverflow 2012-08-13 08:39:23

+0

靜態本地在程序啓動前被初始化;它們在第一次遇到時會默認初始化(對於對象類型)。 – ecatmur 2012-08-13 08:47:03

2

的問題是在

strlen(ch); 

strlen計算字符的數量,直到達到\0符號。這裏,ch是未初始化的,所以strlen可能返回任何東西

1

至於從strlen的結果,你的情況,你有一個未初始化char陣列,因此strlen只有發生產生:必須有數組元素8空字符,但是這個代碼可以給每次不同的結果爲strlen

總是初始化字符串,它以與陣列很容易:char str[15] = {0};

sizeof是用於獲得一個變量的大小或數據類型,或者通過在陣列佔用的字節數的運算符, C字符串的長度;不要指望strlenstrcpy可以互換,甚至可以用任何有用的方法進行比較。

例如:

int main() 
{ 
    char str[15] = "only 13 chars"; 

    cout << "strlen: " << strlen(str) << endl; 
    cout << "sizeof: " << sizeof(str) << endl; 
} 

輸出是:

strlen: 13 
sizeof: 15 
6

你的代碼有未定義行爲是因爲您strlen閱讀您的陣列的初始化值。如果你想從strlen得到確定的結果,你必須初始化(或分配給)你的數組。

E.g.

char ch[15] = "Hello, world!"; 

char ch[15] = {}; 

sizeof會給它的操作數的大小,作爲char的大小是一個根據定義char[15]的大小總是會15.

strlen給出以給定的char數組中的第一個char的值爲0的偏移量結束的空字符串的長度。對於要求strlen有效的調用,參數必須實際指向以空字符結尾的字符串。

0

返回str的長度。

C字符串的長度由終止 空字符來確定:A C字符串是隻要字符串的開始和終止空 字符之間 的量。

sizeof返回字節數(15)。你的數組由垃圾填充,所以,strlen可以返回任何數字。正確的例子是

int main() 
{ 
    char ch[15] = {0}; 
    cout<<strlen(ch)<<endl; //0 
    cout<<sizeof(ch)<<endl; //15 
    return 0; 
}