2014-09-29 175 views
0

我構造以與陣列:獲取長度

char *state[] = {"California", "Oregon", "Texas"};

我想要得到加利福尼亞的長度應爲10但是當我做的sizeof(狀態[0]) ,它只是給我8(我認爲這意味着8個字節,因爲char的大小是1字節)。但爲什麼8而不是10?我仍然能夠通過循環狀態[0] [i]打印出加州的每個字符。

我是C新手,有人可以向我解釋這個嗎?

+0

使用['strlen'](http://en.cppreference.com/w/c/string/byte/strlen)。 – juanchopanza 2014-09-29 07:06:48

+0

使用'strlen',而不是'sizeof'。 – 2014-09-29 07:06:50

+0

'state [0]'不是一個字符串,它是一個字符指針。 'sizeof'給出了內存中變量的大小,在這種情況下是8個字節(如果state [0]是一個整數,它將返回4)。 C沒有字符串長度的概念,找到它的唯一方法是遍歷數組,直到遇到字符'\ 0'(C中的所有字符串通常以該字符結尾) – makhan 2014-09-29 07:19:46

回答

3

最簡單的解釋是sizeof編譯時間求值的表達式。因此它對字符串的長度一無所知,它基本上是需要在運行時進行評估的東西。

要獲取字符串的長度,請使用strlen。返回字符串的長度爲而不是,包括隱含的空終止符,它告訴C運行時字符串的末尾在哪裏。

另一件事,在設置字符串數組時使用const char* []是個好習慣。這加強了這樣的事實:它是未定義的行爲修改任何的數組內容。

+0

但是,這些是字符串文字,sizeof運算符知道的。 'sizeof(「California」)'是非常好的代碼,並且會給出字符串長度。問題是這些字符串是通過指針引用的,所以類型信息會一路丟失。 http://stackoverflow.com/questions/1704407/what-is-the-difference-between-char-s-and-char-s-in-c – Lundin 2014-09-29 08:09:07