我有這樣的代碼: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
陣列?
我有這樣的代碼: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
陣列?
ch
是局部變量,局部變量未初始化。所以你假設它是一個空字符串是不正確的。它充滿了垃圾。這僅僅是一個共同發病率,一個\0
字符在後7個亂碼發現,因此strlen
返回7.
你可以不喜歡這些,以確保空與字符串
char ch[15]={0};
ch[0]='\0`;
strcpy(ch,"");
這裏有一個類似的線程更多閱讀
靜態局部變量是默認初始化的;)還是被初始化了值?該死的,我從來沒有得到這個權利。 – fredoverflow 2012-08-13 08:39:23
靜態本地在程序啓動前被初始化;它們在第一次遇到時會默認初始化(對於對象類型)。 – ecatmur 2012-08-13 08:47:03
的問題是在
strlen(ch);
strlen
計算字符的數量,直到達到\0
符號。這裏,ch
是未初始化的,所以strlen
可能返回任何東西。
至於從strlen
的結果,你的情況,你有一個未初始化char
陣列,因此strlen
只有發生產生:必須有數組元素8空字符,但是這個代碼可以給每次不同的結果爲strlen
。
總是初始化字符串,它以與陣列很容易:char str[15] = {0};
sizeof
是用於獲得一個變量的大小或數據類型,或者通過在陣列佔用的字節數的運算符,不 C字符串的長度;不要指望strlen
和strcpy
可以互換,甚至可以用任何有用的方法進行比較。
例如:
int main()
{
char str[15] = "only 13 chars";
cout << "strlen: " << strlen(str) << endl;
cout << "sizeof: " << sizeof(str) << endl;
}
輸出是:
strlen: 13
sizeof: 15
你的代碼有未定義行爲是因爲您strlen
閱讀您的陣列的初始化值。如果你想從strlen
得到確定的結果,你必須初始化(或分配給)你的數組。
E.g.
char ch[15] = "Hello, world!";
或
char ch[15] = {};
sizeof
會給它的操作數的大小,作爲char
的大小是一個根據定義char[15]
的大小總是會15.
strlen
給出以給定的char
數組中的第一個char
的值爲0
的偏移量結束的空字符串的長度。對於要求strlen
有效的調用,參數必須實際指向以空字符結尾的字符串。
返回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;
}
它不是空的。它裝載了未初始化的垃圾。 – Mysticial 2012-08-13 08:13:08