2016-11-13 79 views
2

我必須將一個char數組初始化爲0。我做到了像打印0初始化數組元素的值不會打印什麼,爲什麼?

char array[256] = {0}; 

我想檢查它是否工作,所以我嘗試測試它

#include <stdio.h> 

int main() 
{ 
    char s[256] = {0}; 
    printf("%c\n", s[10]); 
    return 0; 
} 

後,我編譯並運行它,在命令行中輸出顯示什麼。

我錯過了什麼?也許我以錯誤的方式初始化了數組?

+6

你期望它打印什麼? –

+0

它打印一個文字零,所以'printf'認爲它完成了,因爲它標記了一個字符串的末尾。 – usr2564301

+0

我的不好,搞錯了:) @SouravGhosh –

回答

9

TL; DR -%c是字符表示法。使用%d可查看小數0值。

相關,從C11,章§7.21.6.1,(重點煤礦

c                如果沒有l長度改性劑是目前,int參數被轉換爲一個 unsigned char,和結果字符被寫入。

僅供參考,請參閱printable值的列表。

也就是說,對於託管環境,int main()應該是int main(void),至少要符合標準。

+1

謝謝。確實必須從'%c'改爲'%d' –

5

要打印s[10]作爲字符(%c),以及s[10]數值是0,它代表了字符\0,這意味着字符串的結束,並且沒有文本表示。出於這個原因,你沒有看到任何東西。

如果你想看到的數值,而不是字符值,使用%d打印它作爲一個小數(整數)數量:

printf("%d\n", s[10]); 

注意字符串的結尾是不一樣的結束正如你的評論之一所述。字符串結尾意味着對字符序列的任何字符串操作必須在第一個\0到達時停止。如果字符序列在\0之後有其他內容,則不會打印,因爲字符串操作會在第一個\0字符上停止。

但是,行結束是一個正常字符,其視覺效果是指終端或文本編輯器在新行的行結束後打印下一個字符。

如果你想有一個完整的行尾字符的矢量(並打印出來這樣),你必須前往載體和填充:

char s[256]; 
int i; 

for (i = 0; i < 256; ++i) 
    s[i] = '\n'; 

printf("%c\n", s[10]); 

ASCII碼(十進制/數字)值行字符的結束(\n)是12,因此,下面的片段將相當於:

char s[256]; 
int i; 

for (i = 0; i < 256; ++i) 
    s[i] = 12; 

printf("%c\n", s[10]); 

這並不然而工作(它不打印一個新行):

char s[256] = {'\n'}; // or {12}; 

printf("%c\n", s[10]); 

由於{'\n'}效果是分配\n到所述陣列的所述第一元件和陣列的類型,您在製作(char[]int[]或任何)其中remainings 255字符填充有值0,不管。如果你寫一對空括號{},所有的元素將是0

因此,這兩個語句是等價的:

char s[256] = {}; // Implicit filling to 0. 
char s[256] = {0}; // Implicit filling to 0 from the second element. 

然而,如果沒有定義數組:

char s[256]; 

該數組未填充(未初始化),因此,s的每個元素都將包含任何內容,直到您使用值填充爲止,例如for

我希望所有這些例子都能得到全貌。

+0

謝謝!我正在打印一個換行符,所以它使我瘋狂......不知道爲什麼沒有打印,而我期望0 –

+0

@TonyTannous編輯。 –