控制字符 ASCII值控制字符 ASCII值控制字符 ASCII值控制字符 0 NUL 32 (space) 64 @ 96 ` ?1 SOH 33 ! 65 A 97 a ?2 STX 34 " 66 B 98 b ?3 ETX 35 # 67 C 99 c ?4 EOT 36 ?$ 68 D 100 d
5 ENQ 37 % 69 E 101 e ?6 ACK 38 & 70 F 102 f ?7 BEL 39 ' 71 G 103 g ?8 BS 40 ( 72 H 104 h ?9 HT 41 ) 73 I 105 i ?10 LF 42 * 74 J 106 j ?11 VT 43 + 75 K 107 k ?12 FF 44 , 76 L 108 l ?13 CR 45 - 77 M 109 m ?14 SO 46 . 78 N 110 n ?15 SI 47 / 79 O 111 o ?16 DLE 48 0 80 P 112 p ?17 DC1 49 1 81 Q 113 q ?18 DC2 50 2 82 R 114 r ?19 DC3 51 3 83 S 115 s ?20 DC4 52 4 84 T 116 t ?21 NAK 53 5 85 U 117 u ?22 SYN 54 6 86 V 118 v ?23 ETB 55 7 87 W 119 w ?24 CAN 56 8 88 X 120 x ?25 EM 57 9 89 Y 121 y ?26 SUB 58 : 90 Z 122 z ?27 ESC 59 ?91 [ 123 { ?28 FS 60 < 92 \ 124 | ?29 GS 61 = 93 ] 125 } ?30 RS 62 > 94 ^ 126 ~ ?31 US 63 ? 95 _ 127 DEL NUL ?空字符 VT ? 垂直制表 SYN ?同步 SOH ?標題開始 FF ? 走紙控制 ETB ?信息組傳送結(jié)束 STX ?正文開始 CR ? 回車 CAN ?作廢 ETX ?正文結(jié)束 SO ? 移位輸出 EM ? 媒介結(jié)束 End of Medium ?EOT ?傳輸結(jié)束 SI ? 移位輸入 SUB ?換置 ENQ ?詢問字符 DLE ?Data Link Escape ESC ?Escape ?ACK ?確認 DC1 ?設備控制1 FS ? 文件分隔符 BEL ?響鈴 DC2 ?設備控制2 GS ? 組分隔符 BS ? 退格 DC3 ?設備控制3 RS ? 記錄分隔符 HT ? 橫向制表 DC4 ?設備控制4 US ? 單元分隔符 LF ? 換行 NAK ?否定 DEL ?刪除
2016-10-10
C語言基本類型:字符型(char)用法介紹
1.字符型(char)簡介
字符型(char)用于儲存字符(character),如英文字母或標點。嚴格來說,char 其實也是整數(shù)類型(integer type),因為 char 類型儲存的實際上是整數(shù),而不是字符。計算機使用特定的整數(shù)編碼來表示特定的字符。美國普遍使用的編碼是 ASCII(American ? ?Standard ? ?Code ? for ? ?Information ? Interchange ?美國信息交換標準編碼)。例如:ASCII 使用 65 來代表大寫字母 A,因此存儲字母 A 實際上存儲的是整數(shù)65。注意:許多IBM大型機使用另一種編碼——EBCDIC(Extended Binary-Coded Decimal Interchange Code 擴充的二進制編碼的十進制交換碼);不同國家的計算機使用的編碼可能完全不同。
ASCII 的范圍是 0 到 127,故而 7 位(bit)就足以表示全部 ASCII。char 一般占用 8 位內(nèi)存單元,表示ASCII綽綽有余。許多系統(tǒng)都提供擴展ASCII(Extended ASCII),并且所需空間仍然在 8 位以內(nèi)。注意,不同的系統(tǒng)提供的擴展 ASCII 的編碼方式可能有所不同!
許多字符集超出了 8 位所能表示的范圍(例如漢字字符集),使用這種字符集作為基本字符集的系統(tǒng)中,char 可能是 16 位的,甚至可能是 32 位的。總之,C 保證 char 占用空間的大小足以儲存系統(tǒng)所用的基本字符集的編碼。C 語言定義一個字節(jié)(byte)的位數(shù)為 char 的位數(shù),所以一個字節(jié)可能是 16 位,也可能是 32 位,而不僅僅限于 8 位。
2. 聲明字符型變量
字符型變量的聲明方式和其它類型變量的聲明方式一樣:
char good;
char better, best;
以上代碼聲明了三個字符型變量:good、better,和 best。
3. 字符常量與初始化
我們可以使用以下語句來初始化字符型變量:
charch = 'A';
這個語句把ch的值初始化為 A 的編碼值。在這個語句中,'A' 是字符常量。C 語言中,使用單引號把字符引起來就構(gòu)成字符常量。我們來看另外一個例子:
char fail; ? ? ? ? /* 聲明一個字符型變量 ? ? ? ?*/ ? ? ? ? ? ? ? fail = 'F'; ? ? ? ? ?/* 正確 ? ? ? ? ? ? ? ? ? ? ?*/ ? ? ? ? ? ? ? fail = "F"; ? ? ? /* 錯!"F" 是字符串字面量 ? ? ?*/
把字符用雙引號引起來構(gòu)成字符串字面量,所以第三個語句是錯誤的。我們會在后續(xù)的教程中討論字符串,現(xiàn)在暫且把它放下。
因為字符實質(zhì)上是以數(shù)字的形式存儲的,所以我們可以直接使用數(shù)字來初始化字符變量,或者給字符變量賦值:
char ch = 65; /* 不好的風格 */
在 ASCII 中,A 的編碼是 65,所以對于使用 ASCII 的系統(tǒng)來說,這個語句等同于 char ch = 'A';。使用非 ASCII 的系統(tǒng)中,65 代表的不一定是 A,而有可能是其它任何字符,所以使用數(shù)字來初始化字符變量,或者給字符變量賦值是一種不好的風格,因為移植性太差了!但是,使用字符常量(例如 'A')來初始化字符變量,或者給字符變量賦值,字符變量得到的一定是我們所期待的字符的編碼值。例如:
charch = 'A';
無論在使用任何編碼的系統(tǒng)中,ch都能夠得到字符 A 所對應的編碼值。這是因為編譯器會自動把 'A' 轉(zhuǎn)化成 A 所對應的編碼值。因此,我們應該使用字符常量來初始化字符變量,或者給字符變量賦值;而不要用數(shù)字。
有趣的是,C 使用int類型來處理字符常量,而不是 char 類型。例如,在使用32位int的ASCII 系統(tǒng)中,以下代碼
charch = 'C';
'C' 的編碼值 67 被存儲于 32 位的內(nèi)存單元中;不過ch仍然存儲于 8 位的內(nèi)存單元中,只是它的值變成了 67。因此,我們可以定義形如 'good' 的古怪字符常量。因為每個字符的編碼值占用 8 位的內(nèi)存單元,所以這個常量剛好可以存儲于 32 位的內(nèi)存單元。然而,用這種字符常量初始化字符變量,或者給字符變量賦值的話,導致的結(jié)果是,字符變量只能得到字符常量的最后 8 位。也就是說,以下代碼
charch = 'good';
ch得到的是 'd' 的值。
以后,在沒有特殊說明的情況下,我們討論的都是 ASCII。 ASCII值
控制字符 ASCII值控制字符 ASCII值控制字符 ASCII值控制字符 0 NUL 32 (space) 64 @ 96 ` ?1 SOH 33 ! 65 A 97 a ?2 STX 34 " 66 B 98 b ?3 ETX 35 # 67 C 99 c ?4 EOT 36 ?$ 68 D 100 d
5 ENQ 37 % 69 E 101 e ?6 ACK 38 & 70 F 102 f ?7 BEL 39 ' 71 G 103 g ?8 BS 40 ( 72 H 104 h ?9 HT 41 ) 73 I 105 i ?10 LF 42 * 74 J 106 j ?11 VT 43 + 75 K 107 k ?12 FF 44 , 76 L 108 l ?13 CR 45 - 77 M 109 m ?14 SO 46 . 78 N 110 n ?15 SI 47 / 79 O 111 o ?16 DLE 48 0 80 P 112 p ?17 DC1 49 1 81 Q 113 q ?18 DC2 50 2 82 R 114 r ?19 DC3 51 3 83 S 115 s ?20 DC4 52 4 84 T 116 t ?21 NAK 53 5 85 U 117 u ?22 SYN 54 6 86 V 118 v ?23 ETB 55 7 87 W 119 w ?24 CAN 56 8 88 X 120 x ?25 EM 57 9 89 Y 121 y ?26 SUB 58 : 90 Z 122 z ?27 ESC 59 ?91 [ 123 { ?28 FS 60 < 92 \ 124 | ?29 GS 61 = 93 ] 125 } ?30 RS 62 > 94 ^ 126 ~ ?31 US 63 ? 95 _ 127 DEL
NUL ?空字符 VT ? 垂直制表 SYN ?同步
SOH ?標題開始 FF ? 走紙控制 ETB ?信息組傳送結(jié)束
STX ?正文開始 CR ? 回車 CAN ?作廢
ETX ?正文結(jié)束 SO ? 移位輸出 EM ? 媒介結(jié)束 End of Medium ?EOT ?傳輸結(jié)束 SI ? 移位輸入 SUB ?換置
ENQ ?詢問字符 DLE ?Data Link Escape ESC ?Escape ?ACK ?確認 DC1 ?設備控制1 FS ? 文件分隔符 BEL ?響鈴 DC2 ?設備控制2 GS ? 組分隔符 BS ? 退格 DC3 ?設備控制3 RS ? 記錄分隔符 HT ? 橫向制表 DC4 ?設備控制4 US ? 單元分隔符 LF ? 換行 NAK ?否定 DEL ?刪除
4.不可打印字符(Nonprinting Characters)
有些 ASCII 字符是不可打印的。例如退格、另起一行、警報等。C 語言提供了兩種方法來表示這種不可打印字符。
第一種方法是使用 ASCII 編碼。例如,ASCII 編碼中,7 用于表示警報:
char beep = 7;
第二種方法是使用特殊符號序列,也就是所謂的轉(zhuǎn)義字符escape sequences)。參見下表:(
轉(zhuǎn)義字符含義
\a ? ? ? ? ? ?警報( Alert (ANSI C) ) ? ? ? ? ? \b ? ? ? ? ? ?退格(Backspace) ? ? ? ? ? \f ? ? ? ? ? ?換頁(Form feed)
換行(Newline)
回車(Carriage return)
\t ? ? ? ? ? ?水平制表符(Horizontal tab) ? ? ? ? ? \v ? ? ? ? ? ?垂直制表符(Vertical tab) ? ? ? ? ? \\ ? ? ? ? ? ?反斜桿( Backslash (\) )
\' ? ? ? ? ? ?單引號( Single quote (') ) ? ? ? ? ? \" ? ? ? ? ? ?雙引號( Double quote (") ) ? ? ? ? ? \? ? ? ? ? ? ?問號( Question mark (?) )
\0oo ? ? ? ?八進制數(shù)( Octal value (o 代表一個八進制數(shù)字) ) ? ? ? ? ? \xhh十六進制數(shù)( Hexadecimal value (h 代表一個十六進制數(shù)字) )
給變量賦值的時候,轉(zhuǎn)義字符必須使用單引號引住。例如:
charnl = ' ';
下面我們詳細學習每個轉(zhuǎn)移字符的含義。
\a(警報)是 ANSI C89 添加的,用于產(chǎn)生可聽或者可視的警報。\a 產(chǎn)生的效果取決于硬件。一般來說,輸出 \a 會產(chǎn)生鳴響。但是在某些系統(tǒng),輸出 \a 不會產(chǎn)生任何效果,或者僅僅顯示一個特殊字符。標準明確指出,\a 不應該改變當前活躍位置(active position)。所謂活躍位置,是指顯示設備(顯示器、打字機、打印機等等)顯示下一個字符的位置。以顯示器為例,活躍位置就是指光標所處的位置,輸出 \a 不會導致光標移動位置。
\b、\f、、、\t,以及 \v 都是輸出設備控制符。退格符(\b)使當前行的活躍位置后退一個位置。換頁符(\f)使活躍位置跳到下一頁的開端。注:換頁符可用于控制打印機換頁,但不會導致 PC 機的顯示屏換頁。換行符()使活躍位置跳到下一行的開端。回車符()使活躍位置返回當前行的開端。水平制表符(\t)使活躍位置移動若干個位置(通常是8個)。垂直制表符(\v)使活躍位置換若干行。注:\v可用于控制打印機換若干行,但是不會導致
PC機的顯示屏換行。
\\、\',以及 \" 使我們可以把 \,' 和 " 用作字符常量。如果要打印以下句子:
"\ is called 'backslash'."
我們需要使用如下語句:
printf("\"\\ is called \'backslash\'.\"");
\0oo 和 \xhh是ASCII碼的兩種特殊表示形式。如果想用八進制ASCII碼表示字符,可以在八進制數(shù)前面加上 \ ,然后用單引號引起來。例如:
beep = '\007'; ? ? ? ?/* ?\007 代表 \a ?*/
打頭的那些0可以省略,也就是說,寫成 '\07' 或者 '\7' 都一樣。無論有沒有打頭的0 ,7 都會被當成八進制數(shù)處理。
從 C89 開始,C提供了用十六進制表示字符常量的方法:在反斜桿后面寫一個 x ,然后再寫 1 到 3 個十六進制數(shù)字。例如:
nl = '\xa'; ? ? ? ?/* ?\xa代表 ?*/
注意:使用ASCII碼時,要注意區(qū)分數(shù)字4的ASCII碼是52 ,'4' 代表字符 4 ,而不是數(shù)字4。此外,盡管 ' ' 和 '\xa' ,'\a' 和 '\007' 是等價的,但是我們應該盡可能使用 ' ' 和 '\a' ,而不要用 '\xa' 和 '\007' 。這是因為前者易懂、便于記憶,而且移植性更高。而后者只對使用ASCII碼的系統(tǒng)有效。和數(shù)字字符。例如:字符
5. 字符輸出
printf函數(shù)使用 %c 表示輸出字符。因為字符是以 1 字節(jié)整數(shù)的形式存取的,所以,如果使用 %d 的話,輸出的會是整數(shù)。例如:
/* 這個程序輸出字符以及字符的整數(shù)編碼 */ #include <stdio.h>
int main(void) {
charch;
printf("Please enter a character. ");
scanf("%c", &ch); ? /* 由用戶輸入一個字符 */ printf("The code for %c is %d. ", ch, ch); ?return 0; }
請各位自行編譯執(zhí)行此程序,查看其執(zhí)行結(jié)果。輸入字符后記得要按回車鍵。
printf函數(shù)輸出ch的值兩次,第一次以字符的形式輸出(因為格式限定符為 %c),第二次以十進制整數(shù)的形式輸出(因為格式限定符是 %d)。注意:格式限定符只是用于指定數(shù)據(jù)的輸出形式,而不是用來指定數(shù)據(jù)怎么存儲。
6.字符類型的符號
某些編譯器中,char 默認是有符號的(signed)。對于這類型的編譯器來說,char 的表示范圍通常是 -128 到 127 。而另外一些編譯器中,char 默認是無符號的(unsigned)。對于這類型的編譯器來說,char 的表示范圍通常是 0 到 255 。一般來說,編譯器的使用說明會注明它默認把 char 當作有符號的還是無符號的。
從 C89 開始,我們可以使用關鍵字 signed 和 unsigned 來修飾 char 。這么一來,無論編譯器默認 char 是有符號的也好,無符號的也罷,我們都可以用 signed char 表示有符號 char ,也可以用 unsigned char 表示無符號 char 。
來源:C Primer Plus第五版(中文版)