2014-09-02 104 views
-2

我有一個字符數組:分配和比較字符到整數

char arr[5]; 

說我給它分配的值:

arr[0] = 1; 
arr[1] = 2; 
arr[2] = 3; 
arr[3] = 4; 
arr[4] = 5; 

當我打印使用:

printf("%c\n", arr[0]) 

沒有什麼打印出來(只有換行符)。

當我打印使用:

printf("%d\n", arr[0]) 

值1被打印出來(和換行)。

這是怎麼發生的?當你給一個char變量賦一個整數時究竟發生了什麼?它被鑄造了嗎?

+0

http://en.wikipedia.org/wiki/ASCII – juanchopanza 2014-09-02 15:34:50

+0

它可能打印ASCII字符SOH,它沒有可見的等效物 – Brian 2014-09-02 15:35:14

+1

您正在通過控制-E打印控制-A。你可以通過運行'od -c'或者'sed l'或者其他類似的東西來看到輸出,讓不可見的字符可見。 – 2014-09-02 15:40:56

回答

1

人數1有不同的ASCII值的字符'1',這是49 當你使用它%c將此視爲一個ASCII字符。

如果用字符,而不是數字初始化您的數組,然後你會發現你從

printf("%c\n", arr[0]) 

arr[0] = '1'; 
arr[1] = '2'; 
arr[2] = '3'; 
arr[3] = '4'; 
arr[4] = '5'; 
0

期待什麼字符代碼1-5是不可打印的控制字符, Control-AControl-E

以下代碼:

#include <stdio.h> 

int main(void) 
{ 
    char arr[5]; 

    arr[0] = 1; 
    arr[1] = 2; 
    arr[2] = 3; 
    arr[3] = 4; 
    arr[4] = 5; 

    for (int i = 0; i < 5; i++) 
     printf("%c\n", arr[i]); 

    return 0; 
} 

可編譯成程序ccc,然後運行:

$ ccc 




$ ccc | odx 
0x0000: 01 0A 02 0A 03 0A 04 0A 05 0A      .......... 
0x000A: 
$ ccc | od -c | so 
0000000 001 \n 002 \n 003 \n 004 \n 005 \n       
0000012 
$ ccc | sed l 
\001$ 

\002$ 

\003$ 

\004$ 

\005$ 

$ 

雖然有值1-5沒有可見字符(控制字符在終端上沒有可見的表示),十六進制轉儲程序(odx,自制程序),od -csed l都可以看到輸出中的控制字符。

如果要查看數字'1''5',請使用單引號字符常量代替(未加引號)的數字。

順便提及,在呼叫:

printf("%c\n", arr[0]); 
printf("%d\n", arr[0]); 

arr[0]自動地被調用可變參數(變量參數列表)的標準規則功能如printf()晉升爲int。所有參數類型爲char(包括有符號和無符號變量)和short在自變量列表的變量部分都自動提升爲int,並且float類型的任何值都被提升爲double。(可以想象,unsigned short可能會被提升爲unsigned int,如果普通int無法存儲最大值unsigned short,但這意味着sizeof(short) == sizeof(int)因此促銷無論如何都是無效的。現在我已經覆蓋了我的屁股,您可以忘掉它。)格式字符串中的轉換規範控制如何向用戶呈現值int