2012-05-28 32 views
0

我想出了一個奇怪的問題,我有一個字符串,其中顯示的所有字符和數字沒有任何問題。但同樣的事情是不可能的整數數組。據我所知字符串是一個NULL終止字符數組。所以,什麼使字符串不同,以顯示所有內容沒有任何歧視。爲什麼字符串數組不能區分數值,但整型數組不顯示字符?

任何幫助表示讚賞。謝謝!

+6

code..code。 ...代碼...代碼 –

+0

像這樣的問題已經導致像Haskell,Python等新語言的發展...沒有任何問題打印任何「數組」 – gcbenison

回答

1

指示編譯器打印它們的方式使它們不同。

當你寫

printf("%s", charPtr); 

你告訴它應該把charPtr作爲NULL封端的字符串的編譯器。它查看內存charPtr指向並將每個字節解釋爲字符,直到達到0

通用數組類型沒有等價物。

1

這樣?:

#include <stdio.h> 

int main(void) 
{ 

    int a =1; 
    int array[] = {1,2,3}; 
    const char c = 'a'; 
    char str[] = "hello"; 
    const char char_a[] ={119,111,114,108,100,0}; //ascii codes for world 

    printf("this is a int: %d\n",a); 
    printf("this is a int array: %d, prints only the first element of array\n",*array); 
    printf("this is a int array: %d, prints only the 2. element of array\n",array[1]); 
    printf("this is a char: %c\n",c); 
    printf("this is a char array: %c, print only first element of str\n",*str); 
    printf("this is a char array: %s, prints to \\0 \n",str); 
    printf("this is a char array(made from numbers): %s, prints to 0 \n",char_a); 
    return 0; 
} 

的選項%S告訴printf的,它應該想想陣列 作爲一個字符中的元素,而且它應打印,直到它達到\ 0。

1

/*問題的答案在底部。一句話,呵呵。 */

由於char字符串與NULL分界,又名0值,printf會在遇到一個字符時停止。現在,讓我們說我們有兩個數組,一個char和一個int,像這樣:

char char_array[] = { 'a', 'b', 'c', '\0' }; 
int int_array[] = { 'a', 'b', 'c', '\0' }; 

現在,如果我們試圖打印那些:

printf("char array: %s\n", char_array); 
printf("int array: %s\n", (char*) int_array); 

我們會得到這樣的輸出:

char array: abc 
int array: a 

而且即使我們沒有將int_array轉換爲char*,它仍然會執行相同的操作(編譯器可能會抱怨)。但爲什麼呢?讓我們檢查一下存放這兩個數組的內存。 (於小端)的CHAR_ARRAY成立:0x00636261 而INT_ARRAY持有分離(每32位):0x00000061 0x00000062 0x00000063 0x00000000

那麼,什麼情況是 - 一次printf讀取一個串一個char,換句話說,一個字節。因此,當讀取int_array時,它讀取第一個字節,即0x61(字符'a'),然後跳轉到下一個字節。但哎呀!下一個字節0x00(0x0000 61)!這表示字符串結束並停止。

現在,讓我們設置在INT_ARRAY的值:

int int_array[] = { 0x61616161, 0x62626262, 0x63636363, '\0' }; 

現在打印int array: aaaabbbbcccc

由於值不再有任何0x00間隔,因此只需打印printf,直至達到我們初始化爲零的第四個整數。這就是說,如果你想打印一個int數組,因爲它是一個字符串,你必須編寫一個函數/包裝來構建一個只保存每個int的第一個字節值的char字符串,或者一個建立一個字符串,其中所有的0x00值都被刪除。

所以,回答你的問題「是什麼讓他們不同」:因爲這是C,所有這些都只是一堆點,也就是普通的舊數據。所以唯一的區別是我們如何對待它。就這樣,我敢打賭你,如果char_array會連續分配,並對齊,如果你會使用char_array*((int*) char_array),對小端,它會給你的65132490x00636261)的值=]

相關問題