2016-02-04 44 views
0

我正在學習C語言,我遇到了這個奇怪的字符串問題。我正在玩弄字符串和不同的方式來聲明字符串並查看其內容。C中的字符串文字以%?結尾

當使用char數組聲明一個字符串,然後打印該數組的每個元素時,它會產生預期的輸出。它打印每個字符,以空字符結束。

當聲明一個字符串字面值並打印出結果數組的內容時,我注意到字符被添加到空字節後面的字符串中。

%從哪裏來?

代碼如下。我通過編譯代碼; $ gcc nameStuff.c -o nameStuff

我在我自己的Mac機器上以及學校的遠程Linux服務器上都試過這個,並且兩次都得到了相同的輸出。

下面的代碼:

char myName[] = {72, 97, 121, 100, 101, 110, 0}; // my name in ASCII values 
char *name = "Hayden";        // my name as string literal 

printf("%s, size: %ld\n", myName, sizeof(myName)); // 
printf("%s, size: %ld\n", name, sizeof(name)); 

int length1 = sizeof(myName); 
int length2 = sizeof(name); 
int i; 

// prints char value of each element in ascii array 
for (i = 0; i < length1; i++) { 
    printf("%c,", myName[i]); 
} 
puts(""); 
// prints int value of each element in ascii array 
for (i = 0; i < length1; i++) { 
    printf("%d,", myName[i]); 
} 
puts("\n"); 

// prints char value of each element in string literal array 
for (i = 0; i < length2; i++) { 
    printf("%c,", name[i]); 
} 
puts(""); 
// prints int value of each element in string literal array 
for (i = 0; i < length2; i++) { 
    printf("%d,", name[i]); 
} 
puts(""); 

下面是輸出:

Hayden, size: 7 
Hayden, size: 8 
H,a,y,d,e,n,, 
72,97,121,100,101,110,0, 

H,a,y,d,e,n,,%, 
72,97,121,100,101,110,0,37, 

我問我的教授這件事,他說,這可能與代碼中的問題,但它很難爛攤子簡單代碼的幾行代碼。預先感謝您的考慮。

+3

'sizeof(name);'不是字符串的長度! – BeyelerStudios

+0

'sizeof()'返回一個變量的大小,以字節爲單位。 'name'是一個指針,就你而言,顯然你使用的是64位編譯器,所以'name'的長度是8個字節。如果你用32位編譯器重新編譯過,你會發現'sizeof(name)'的結果是4,因爲32位指針的長度是4個字節。 –

回答

4

運算符sizeof並不意味着計算字符串的長度。在你的情況下,sizeof(char *)顯然是8,並且"Hayden"只有6個字符,所以在實際字符串文字結束後打印一個字符(,即空值終止符)。

myName的情況下,因爲它是一個數組,sizeof實際上是給你的數組元素的數量,因爲sizeof(char)爲1

當數組結束後打印的元素,你的程序調用未定義的行爲。如果稍微改變程序,打印的值就會改變,實際上它似乎是printf()語句中的格式說明符中的一個"%",它們也是字符串文字。

但是,你不能預測這個元素將會是什麼,這只是一個巧合,試着改變一下printf()聲明,你會看到不同之處。

+1

好吧,這是有道理的。所以當使用'sizeof(char *)'的時候,我得到了8,因爲指針是8字節長,而使用sizeof(char)'給了我7,因爲數組的長度是7個字節,加上空字符。感謝您的澄清。對於基本問題抱歉。 –

+2

@HaydenBraxton代碼不使用'sizeof(char)'。代碼使用'sizeof(myName)',就像'sizeof(char [7])'一樣。 'sizeof(char)'是_always_ 1。 – chux

1

%只是你不應該閱讀的RAM中的一些值。正如@BeyelerStudios在評論中指出的那樣,sizeof不是查找字符串多長時間的正確方法,請使用strlen

1

myName是字符,7個字符長的陣列,每個char是1個字節,從而它返回圖7,如果它是7點的整數陣列,每個int的大小4個字節,所以它將返回28 sizeof()總是返回它在內存中佔用的字節大小。 name是指向內存的指針,32位爲4個字節,64位爲8個字節。您應該始終使用strlen()來獲取C字符串的長度。

相關問題