2017-03-13 50 views
3

當我運行這段代碼我得到輸出爲4.但我的字符串長度是3爲什麼它給4?Sizeof運算符使用字符串打印其長度

#include <stdio.h> 

int main(void) 
{ 

    printf("%d",sizeof("abc")); 
    return 0; 
} 
+1

'sizeof'告訴你,你的數據項(在這種情況下字符串)佔用多少空間,其中包括字符串的空終止符。如果你想要字符串的長度,使用'strlen(「abc」)'。 – lurker

+0

Ohkay明白了...... – sam1006

回答

5

C中的字符串包含空終止符,所以字符串「abc」實際佔用4個字節。

+0

這意味着沒有使用sizeof運算符的用法是這樣的 – sam1006

+0

@Shubham是正確的,以不符合其定義的含義使用sizeof是沒有用的。 – lurker

+2

@lurker - 字符數組上的sizeof運算符返回數組的大小 - 可能與字符串的長度不同 - 但這是對sizeof的完全合法和有效的使用。 –

4

字符串文字​​的類型是char [4]。它包含字符a,b和c以及終止空字節。你回來的價值反映了這一點。

如果您想要字符串的長度,請使用strlen

printf("%zu\n", strlen("abc")); 

注意使用%zu格式說明,這預計size_t類型的參數,由strlen(和由sizeof)作爲返回的。使用錯誤的格式說明符調用undefined behavior

+3

字符串文字不是'const'限定的(雖然它們是隻讀的,即更改它們的內容是未定義的行爲)。它們的類型是'char [n]',其中'n'足夠大,以便字符串和終止零字節。例如, '「abcd」'是'char [5]'。 *其他語言的內容可能有所不同:C++。* – pmg

+0

@pmg謝謝。刪除了'const'引用。 – dbush

2

其實因爲sizeof「運營商產生size_t類型的結果, 和%d不一定是正確的格式說明你可能會得到未定義行爲 。

爲什麼4?由於初始化器是一個字符串文字,它是一個字符串,並且如果它曾作爲內存中的對象存在,則確實具有空終止符。

+0

不,我沒有得到任何不確定的行爲..它運作良好。爲什麼它會給未定義的行爲? Sizeof運算符返回整數值na ?? – sam1006

+0

不,sizeof返回size_t和正確的格式說明符是%zu。 – rsp

+0

請參閱http:// stackoverflow。com/questions/2524611/How-can-one-print-a-size-t-variable-portably-using-the-printf-family – rsp

0

對於C中的字符串,我會推薦使用strlen(str1)。它返回字符串的長度而不是空終止字符。

size_t strlen(const char *str) 
+0

Yaa我得到了答案 – sam1006