14. 基礎資料型別 (Elementary Data Type):字元型(上)
1.
字元型(char)簡介 字元型(
char)用於儲存字元(
character),如英文字母或標點。嚴格來說,char 其實也是整數類型(
integer type),因為 char 類型儲存的實際上是整數,而不是字元。電腦使用特定的整數編碼來表示特定的字元。美國普遍使用的編碼是
ASCII(American Standard Code for Information Interchange 美國資訊交換標準編碼)。例如:ASCII 使用 65 來代表大寫字母 A,因此儲存字母 A 實際上儲存的是整數65。注意:許多IBM大型主機使用另一種編碼——EBCDIC(Extended Binary-Coded Decimal Interchange Code 擴充的二進位編碼的十進位交換碼);不同國家的電腦使用的編碼可能完全不同。 ASCII 的範圍是 0 到 127,故而 7 位(bit)就足以表示全部 ASCII。char 一般佔用 8 位記憶體單元,表示ASCII綽綽有餘。許多系統都提供
擴充ASCII(Extended ASCII),並且所需空間仍然在 8 位以內。注意,不同的系統提供的擴充 ASCII 的編碼方式可能有所不同! 許多
字元集超出了 8 位所能表示的範圍(例如漢字字元集),使用這種字元集作為
基底字元集的系統中,char 可能是 16 位的,甚至可能是 32 位的。總之,C 保證 char 佔用空間的大小足以儲存系統所用的
基底字元集的編碼。C 語言定義一個位元組(byte)的位元為 char 的位元,所以一個位元組可能是 16 位,也可能是 32 位,而不僅僅限於 8 位。
2.
聲明字元型變數 字元型變數的聲明方式和其它類型變數的聲明方式一樣: char good; char better, best; 以上代碼聲明了三個字元型變數:good、better,和 best。
3.
字元常量與初始化 我們可以使用以下語句來初始化字元型變數: char ch = 'A'; 這個語句把 ch 的值初始化為 A 的編碼值。在這個語句中,'A' 是
字元常量。C 語言中,使用單引號把字元引起來就構成字元常量。我們來看另外一個例子: char fail; /* 聲明一個字元型變數 */ fail = 'F'; /* 正確 */ fail = "F"; /* 錯!"F" 是字串常量 */ 把字元用雙引號引起來構成
字串常量,所以第三個語句是錯誤的。我們會在後續的教程中討論字串,現在暫且把它放下。 因為字元實質上是以數位形式儲存的,所以我們可以直接使用數字來初始化字元變數,或者給字元變數賦值: char ch = 65; /* 不好的風格 */ 在 ASCII 中,A 的編碼是 65,所以對於使用 ASCII 的系統來說,這個語句等同於 char ch = 'A';。使用非 ASCII 的系統中,65 代表的不一定是 A,而有可能是其它任何字元,所以使用數字來初始化字元變數,或者給字元變數是一種不好的風格,因為移植性太差了!但是,使用字元常量(例如 'A')來初始化字元變數,或者給字元變數賦值,字元變數得到的一定是我們所期待的字元的編碼值。例如: char ch = 'A'; 無論在使用任何編碼的系統中,ch 都能夠得到字元 A 所對應的編碼值。這是因為編譯器會自動把 'A' 轉化成 A 所對應的編碼值。因此,我們應該使用字元常量來初始化字元變數,或者給字元變數賦值;而不要用數字。 有趣的是,C 使用 int 類型來處理字元常量,而不是 char 類型。例如,在使用32位 int 的ASCII 系統中,以下代碼 char ch = 'C'; 'C' 的編碼值 67 被儲存於 32 位的記憶體單元中;不過 ch 仍然儲存於 8 位的記憶體單元中,只是它的值變成了 67。因此,我們可以定義形如 'good' 的古怪字元常量。因為每個字元的編碼值佔用 8 位的記憶體單元,所以這個常量剛好可以儲存於 32 位的記憶體單元。然而,用這種字元常量初始化字元變數,或者給字元變數賦值的話,導致的結果是,字元變數只能得到字元常量的最後 8 位。也就是說,以下代碼 char ch = 'good'; ch 得到的是 'd' 的值。
以後,在沒有特殊說明的情況下,我們討論的都是 ASCII
。
15. 基礎資料型別 (Elementary Data Type):字元型(中)
|
不可列印字元(Nonprinting Characters) 有些 ASCII 字元是不可列印的。例如退格、另起一行、警報等。C 語言提供了兩種方法來表示這種不可列印字元。 第一種方法是使用 ASCII 編碼。例如,ASCII 編碼中,7 用於表示警報: char beep = 7; 第二種方法是使用特殊符號序列,也就是所謂的逸出字元escape sequences)。參見下表:( 逸出字元 含義 \a 警報( Alert (ANSI C) ) \b 退格(Backspace) \f 換頁(Form feed) \n 換行(Newline) \r 斷行符號(Carriage return) \t 水平定位字元(Horizontal tab) \v 垂直定位字元(Vertical tab) \\ 反斜杆( Backslash (\) ) \' 單引號( Single quote (') ) \" 雙引號( Double quote (") ) \? 問號( Question mark (?) ) \0oo 八位元( Octal value (o 代表一個八位元字) ) \xhh 十六進位數( Hexadecimal value (h 代表一個十六進位數字) ) 給變數賦值的時候,逸出字元必須使用單引號引住。例如: char nl = '\n'; 下面我們詳細學習每個轉移字元的含義。 \a(警報)是 ANSI C89 添加的,用於產生可聽或者可視的警報。\a 產生的效果取決於硬體。一般來說,輸出 \a 會產生鳴響。但是在某些系統,輸出 \a 不會產生任何效果,或者僅僅顯示一個特殊字元。標準明確指出,\a 不應該改變當前活躍位置(active position)。所謂活躍位置,是指顯示裝置(顯示器、打字機、印表機等等)顯示下一個字元的位置。以顯示器為例,活躍位置就是指游標所處的位置,輸出 \a 不會導致游標移動位置。 \b、\f、\n、\r、\t,以及 \v 都是輸出裝置控制符。退格符(\b)使當前行的活躍位置後退一個位置。換頁符(\f)使活躍位置跳到下一頁的開端。註:換頁符可用於控制印表機換頁,但不會導致 PC 機的顯示屏換頁。分行符號(\n)使活躍位置跳到下一行的開端。斷行符號符 ( \r ) 使活躍位置返回當前行的開端。水平定位字元(\t)使活躍位置移動若干個位置(通常是8個)。垂直定位字元(\v)使活躍位置換若干行。註:\v可用於控制印表機換若干行,但是不會導致PC機的顯示屏換行。 \\、\',以及 \" 使我們可以把 \,' 和 " 用作字元常量。如果要列印以下句子: "\ is called 'backslash'." 我們需要使用如下語句: printf("\"\\ is called \'backslash\'.\""); \0oo 和 \xhh 是ASCII碼的兩種特殊表示形式。如果想用八進位ASCII碼錶示字元,可以在八位元前面加上 \ ,然後用單引號引起來。例如: beep = '\007'; /* \007 代表 \a */ 打頭的那些0可以省略,也就是說,寫成 '\07' 或者 '\7' 都一樣。無論有沒有打頭的0 ,7 都會被當成八位元處理。 從 C89 開始,C提供了用十六進位表示字元常量的方法:在反斜杆後面寫一個 x ,然後再寫 1 到 3 個十六進位數字。例如: nl = '\xa'; /* \xa 代表 \n */ 注意:使用ASCII碼時,要注意區分數字4的ASCII碼是52 ,'4' 代表字元 4 ,而不是數字4。此外,儘管 '\n' 和 '\xa' ,'\a' 和 '\007' 是等價的,但是我們應該儘可能使用 '\n' 和 '\a' ,而不要用 '\xa' 和 '\007' 。這是因為前者易懂、便於記憶,而且移植性更高。而後者只對使用ASCII碼的系統有效。和數字字元。例如:字元 |
16. 基礎資料型別 (Elementary Data Type):字元型(下)
|
一、字元輸出 printf 函數使用 %c 表示輸出字元。因為字元是以 1 位元組整數的形式存取的,所以,如果使用 %d 的話,輸出的會是整數。例如: /* 這個程式輸出字元以及字元的整數編碼 */#include <stdio.h> int main(void){ char ch; printf("Please enter a character.\n"); scanf("%c", &ch); /* 由使用者輸入一個字元 */ printf("The code for %c is %d.\n", ch, ch); return 0;} 請各位自行編譯執行此程式,查看其執行結果。輸入字元後記得要按斷行符號鍵。 printf 函數輸出 ch 的值兩次,第一次以字元的形式輸出(因為格式限定符為 %c),第二次以十進位整數的形式輸出(因為格式限定符是 %d)。注意:格式限定符只是用於指定資料的輸出形式,而不是用來指定資料怎麼儲存。 二、字元類型的符號 某些編譯器中,char 預設是有符號的(signed)。對於這類型的編譯器來說,char 的表示範圍通常是 -128 到 127 。而另外一些編譯器中,char 預設是無符號的(unsigned)。對於這類型的編譯器來說,char 的表示範圍通常是 0 到 255 。一般來說,編譯器的使用說明會註明它預設把 char 當作有符號的還是無符號的。 從 C89 開始,我們可以使用關鍵字 signed 和 unsigned 來修飾 char 。這麼一來,無論編譯器預設 char 是有符號的也好,無符號的也罷,我們都可以用 signed char 表示有符號 char ,也可以用 unsigned char 表示無符號 char 。 |