2011-02-18 16 views
1

我已經開始學習C了,並且對於數組有點困惑。字符數組是否需要比您打算使用的字節大一個字節? - C

#include <stdio.h> 

int main() 
{ 
    int i; 
    char j[5]; 

    for (i = 0; i < 5; i++) 
    { 
     j[i] = 'a'; 
    } 

    printf("%s\n", j); 
} 

運行這段代碼打印出

aaaaa♣ 

我讀過的字符數組必須是一個字節長於繩子,讓編譯器可以在最後放置\0。如果我這個替換代碼:

#include <stdio.h> 

int main() 
{ 
    int i; 
    char j[5]; 

    for (i = 0; i < 4; i++) 
    { 
     j[i] = 'a'; 
    } 

    printf("%s\n", j); 
} 

我得到的輸出是:

aaaaa 

的字符數組是一個字節的時間比我正在使用。我懷疑這就是爲什麼我在字符串的末尾看不到那個奇怪的字符?

我試圖驗證這一理論用下面的代碼:

#include <stdio.h> 

int main() 
{ 
    int i; 
    char j[5]; 

    for (i = 0; i < 4; i++) 
    { 
     j[i] = 'a'; 
    } 

    for (i = 0; i < 4; i++) 
    { 
     printf("%d\n", j[i]); 
    } 
} 

但是,在輸出中,我看不出有什麼nullbyte。這是因爲它只會在作爲字符串輸出時被添加?

97 
97 
97 
97 

回答

1

在這兩種情況下,你使用預計0端接功能打印字符的陣列而不0終止

附加一個 '\ 0' 到每個字符串(不包括5個字符之一)

for (i = 0; i < 4; i++) 
    { 
     j[i] = 'a'; 
    } 
j[4] = '\0'; 

另外,你的陣列是5個字符/長字節,而不是6.可以存儲4個字符+ 0-終止,而不是5個字符+ 0終止。

對於%d循環,將每個'a'打印爲整數。您傳遞給printf的「%d \ n」字符串會自動以0結尾,所以輸出爲97\n

5

添加空字節是您的工作。編譯器不一定會爲你做。局部變量通常在運行時保持未初始化。

int i; 
char j[5]; /* five uninitialized characters, could be anything */ 

for (i = 0; i < 4; i++) 
{ 
    j[i] = 'a'; 
} 

j[4] = '\0'; /* explicitly add null terminator */ 

請注意,如果你使用一個字符串初始化,而不是手動設置每一個字符,則編譯器將負責將空終止爲您提供:

char j[5] = "aaaa"; /* initialize to {'a', 'a', 'a', 'a', '\0'} */ 
+0

添加固定輸出的空字節。沒有意識到我不得不手動添加。乾杯。還有一個問題:如果我將`for循環`更改爲`i <= 6',則將'b'附加到輸出中。這顯然是溢出我的`j`數組,並因此創建未經處理的輸出......但爲什麼'B'?你能把我連接到C數組上的一些好的閱讀材料嗎? – dave 2011-02-18 00:51:19

1

The char array is one byte longer than I'm using. I suspect this is why I don't see that odd character at the end of the string?

不是真的,如果你只添加了4個元素,第5個元素是巧合。對於第5個字符,您應該已經完成​​了這個j[4] = '\0';,在這種情況下,下一個內存地址的值可能爲\0

But, in the output, I see no nullbyte

那是因爲你只打印前4個字符(見你的循環)。

0

當構建像這樣的字符串時,需要將null字符放入自己。

當您設置一個字符串,你不就是唯一的一次...

char *str = "this is a string"; 

編譯器將在年底爲你彈出\0

CodePad.org

0

沒有空字節,因爲你只打印前四個字節。零位在第五位。另外,除非使用由編譯器生成的字符串(例如「字符串」),否則需要手動設置空字節。你的代碼現在工作的唯一原因是字符串被放置的內存恰好爲0。至於要求空字節,c字符串使用它來指示字符串的結尾。它並不總是用於數組,但只要數組被解釋爲一個字符串就需要在那裏。

相關問題