我想出了一個奇怪的問題,我有一個字符串,其中顯示的所有字符和數字沒有任何問題。但同樣的事情是不可能的整數數組。據我所知字符串是一個NULL
終止字符數組。所以,什麼使字符串不同,以顯示所有內容沒有任何歧視。爲什麼字符串數組不能區分數值,但整型數組不顯示字符?
任何幫助表示讚賞。謝謝!
我想出了一個奇怪的問題,我有一個字符串,其中顯示的所有字符和數字沒有任何問題。但同樣的事情是不可能的整數數組。據我所知字符串是一個NULL
終止字符數組。所以,什麼使字符串不同,以顯示所有內容沒有任何歧視。爲什麼字符串數組不能區分數值,但整型數組不顯示字符?
任何幫助表示讚賞。謝謝!
指示編譯器打印它們的方式使它們不同。
當你寫
printf("%s", charPtr);
你告訴它應該把charPtr
作爲NULL
封端的字符串的編譯器。它查看內存charPtr
指向並將每個字節解釋爲字符,直到達到0
。
通用數組類型沒有等價物。
這樣?:
#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。
/*問題的答案在底部。一句話,呵呵。 */
由於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)
,對小端,它會給你的6513249
(0x00636261
)的值=]
code..code。 ...代碼...代碼 –
像這樣的問題已經導致像Haskell,Python等新語言的發展...沒有任何問題打印任何「數組」 – gcbenison