在實際開發中,程序員很少用單個字符來表示一個完整的數據,字符的意義主要作爲數組的時候可以形成一個字符串。在本章節中,我們更關心字符與整數之間的關係和ASCII碼的相關知識。
字符類型char,只能用單引號' '來包圍,不能用雙引號" "包圍。而字符串只能用雙引號" "包圍,不能用單引號' '包圍。
輸出字符使用 %c,輸出字符串使用 %s。
ASCII碼錶
ASCII(American Standard Code for Information Interchange,美國信息交換標準代碼)是基於拉丁字母的電腦編碼系統,用於顯示現代英語和其他西歐語言,它是現今最通用的單字節編碼系統。
ASCII碼規範於1967年第一次發佈,它包含了33個控制字符(具有某些特殊功能但是無法顯示的字符)和95個可顯示字符。
1、ASCII 控制字符 (字符編碼: 0-31)
在ASCII碼錶中,前32個字符是不能用於顯示的編碼,而是用於控制外圍設備。
十進制 |
符號 |
中文解釋 |
0 |
NULL |
空字符 |
1 |
SOH |
標題開始 |
2 |
STX |
正文開始 |
3 |
ETX |
正文結束 |
4 |
EOT |
傳輸結束 |
5 |
ENQ |
詢問 |
6 |
ACK |
收到通知 |
7 |
BEL |
鈴 |
8 |
BS |
退格 |
9 |
HT |
水平製表符 |
10 |
LF |
換行鍵 |
11 |
VT |
垂直製表符 |
12 |
FF |
換頁鍵 |
13 |
CR |
回車鍵 |
14 |
SO |
移出 |
15 |
SI |
移入 |
16 |
DLE |
數據鏈路轉義 |
17 |
DC1 |
設備控制 1 |
18 |
DC2 |
設備控制 2 |
19 |
DC3 |
設備控制 3 |
20 |
DC4 |
設備控制 4 |
21 |
NAK |
拒絕接收 |
22 |
SYN |
同步空閒 |
23 |
ETB |
傳輸塊結束 |
24 |
CAN |
取消 |
25 |
EM |
介質中斷 |
26 |
SUB |
替換 |
27 |
ESC |
換碼符 |
28 |
FS |
文件分隔符 |
29 |
GS |
組分隔符 |
30 |
RS |
記錄分離符 |
31 |
US |
單元分隔符 |
2、ASCII 可打印字符 (字符編碼: 32-127)
32~126(共95個)是字符:32是空格,其中48~57爲0到9十個阿拉伯數字,65~90爲26個大寫英文字母,97~122號爲26個小寫英文字母,其餘爲一些標點符號、運算符號等。第127個字符表示的是鍵盤上的刪除命令。
十進制 |
符號 |
中文解釋 |
32 |
|
空格 |
33 |
! |
感嘆號 |
34 |
" |
雙引號 |
35 |
# |
井號 |
36 |
$ |
美元符 |
37 |
% |
百分號 |
38 |
& |
與 |
39 |
' |
單引號 |
40 |
( |
左括號 |
41 |
) |
右括號 |
42 |
* |
星號 |
43 |
+ |
加號 |
44 |
, |
逗號 |
45 |
- |
連字號或減號 |
46 |
. |
句點或小數點 |
47 |
/ |
斜槓 |
48 |
0 |
0 |
49 |
1 |
1 |
50 |
2 |
2 |
51 |
3 |
3 |
52 |
4 |
4 |
53 |
5 |
5 |
54 |
6 |
6 |
55 |
7 |
7 |
56 |
8 |
8 |
57 |
9 |
9 |
58 |
: |
冒號 |
59 |
; |
分號 |
60 |
< |
小於 |
61 |
= |
等號 |
62 |
> |
大於 |
63 |
? |
問號 |
64 |
@ |
電子郵件符號 |
65 |
A |
大寫字母 A |
66 |
B |
大寫字母 B |
67 |
C |
大寫字母 C |
68 |
D |
大寫字母 D |
69 |
E |
大寫字母 E |
70 |
F |
大寫字母 F |
71 |
G |
大寫字母 G |
72 |
H |
大寫字母 H |
73 |
I |
大寫字母 I |
74 |
J |
大寫字母 J |
75 |
K |
大寫字母 K |
76 |
L |
大寫字母 L |
77 |
M |
大寫字母 M |
78 |
N |
大寫字母 N |
79 |
O |
大寫字母 O |
80 |
P |
大寫字母 P |
81 |
Q |
大寫字母 Q |
82 |
R |
大寫字母 R |
83 |
S |
大寫字母 S |
84 |
T |
大寫字母 T |
85 |
U |
大寫字母 U |
86 |
V |
大寫字母 V |
87 |
W |
大寫字母 W |
88 |
X |
大寫字母 X |
89 |
Y |
大寫字母 Y |
90 |
Z |
大寫字母 Z |
91 |
[ |
左中括號 |
92 |
\ |
反斜槓 |
93 |
] |
右中括號 |
94 |
^ |
音調符號 |
95 |
_ |
下劃線 |
96 |
` |
重音符 |
97 |
a |
小寫字母 a |
98 |
b |
小寫字母 b |
99 |
c |
小寫字母 c |
100 |
d |
小寫字母 d |
101 |
e |
小寫字母 e |
102 |
f |
小寫字母 f |
103 |
g |
小寫字母 g |
104 |
h |
小寫字母 h |
105 |
i |
小寫字母 i |
106 |
j |
小寫字母 j |
107 |
k |
小寫字母 k |
108 |
l |
小寫字母 l |
109 |
m |
小寫字母 m |
110 |
n |
小寫字母 n |
111 |
o |
小寫字母 o |
112 |
p |
小寫字母 p |
113 |
q |
小寫字母 q |
114 |
r |
小寫字母 r |
115 |
s |
小寫字母 s |
116 |
t |
小寫字母 t |
117 |
u |
小寫字母 u |
118 |
v |
小寫字母 v |
119 |
w |
小寫字母 w |
120 |
x |
小寫字母 x |
121 |
y |
小寫字母 y |
122 |
z |
小寫字母 z |
123 |
{ |
左大括號 |
124 |
| |
垂直線 |
125 |
} |
右大括號 |
126 |
~ |
波浪號 |
127 |
刪除 |
3、轉義字符
對於 ASCII 編碼,0~31(十進制)範圍內的字符爲控制字符,它們都是看不見的,不能在顯示器上顯示,甚至無法從鍵盤輸入,只能用轉義字符的形式來表示。
不過,直接使用 ASCII 碼記憶不方便,也不容易理解,所以,針對常用的控制字符,C語言又定義了簡寫方式,完整的列表如下:
轉義字符 |
意義 |
ASCII碼值 |
使用頻率 |
\n |
換行(LF) ,將當前位置移到下一行開頭。 |
10 |
每天都用 |
\' |
單引號。 |
39 |
常用 |
\" |
雙引號。 |
34 |
常用 |
\\ |
反斜槓。 |
92 |
常用 |
\r |
回車(CR) |
13 |
不常用 |
\t |
水平製表(HT) 。 |
9 |
從未使用 |
\v |
垂直製表(VT)。 |
11 |
從未使用 |
\a |
響鈴(BEL)。 |
7 |
從未使用 |
\b |
退格(BS) ,將當前位置移到前一列。 |
8 |
從未使用 |
\f |
換頁(FF),將當前位置移到下頁開頭。 |
12 |
從未使用 |
\n是最常用的轉義字符,表示換行,讓文本從下一行的開頭輸出,前面的章節中已經多次使用。
\r\n用於windows平臺DOS格式文件的換行。
單引號、雙引號、反斜槓是特殊的字符,不能直接表示。
單引號是字符類型的開頭和結尾,要使用\'表示。
雙引號是字符串的開頭和結尾,要使用\"表示。
反斜槓是轉義字符的開頭,要使用\\表示。
示例(book68.c)
運行結果
字符就是整數
字符和整數沒有本質的區別。可以給 char 變量一個字符,也可以給它一個整數;反過來,可以給 int 變量一個整數,也可以給它一個字符。
char 變量在內存中存儲的是字符對應的 ASCII 碼值。如果以 %c 輸出,會根據 ASCII 碼錶轉換成對應的字符,如果以 %d 輸出,那麼還是整數。
int 變量在內存中存儲的是整數本身,如果以 %c 輸出時,也會根據 ASCII 碼錶轉換成對應的字符。
也就是說,ASCII 碼錶將整數和字符關聯起來了。
char類型佔內存一個字節,signed char取值範圍是-128-127,unsigned char取值範圍是0-255。
描述再準確一些,在char的取值範圍內(0-255),字符和整數沒有本質區別。
示例(book67.c)
運行結果
在ASCII碼錶中,E、F、G、H 的值分別是 69、70、71、72。
常用的庫函數
以下是常用的字符函數,必須掌握。
int isalpha(int ch); 若ch是字母('A'-'Z','a'-'z')返回非0值,否則返回0。
int isalnum(int ch); 若ch是字母('A'-'Z','a'-'z')或數字('0'-'9'),返回非0值,否則返回0。
int isdigit(int ch); 若ch是數字('0'-'9')返回非0值,否則返回0。
int islower(int ch); 若ch是小寫字母('a'-'z')返回非0值,否則返回0。
int isupper(int ch); 若ch是大寫字母('A'-'Z')返回非0值,否則返回0。
int tolower(int ch); 若ch是大寫字母('A'-'Z')返回相應的小寫字母('a'-'z')。
int toupper(int ch); 若ch是小寫字母('a'-'z')返回相應的大寫字母('A'-'Z')
以下是不常用的字符函數,極少使用,瞭解即可。
int isascii(int ch); 若ch是字符(ASCII碼中的0-127)返回非0值,否則返回0。
int iscntrl(int ch); 若ch是作廢字符(0x7F)或普通控制字符(0x00-0x1F),返回非0值,否則返回0。
int isprint(int ch); 若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否則返回0。
int ispunct(int ch); 若ch是標點字符(0x00-0x1F)返回非0值,否則返回0。
int isspace(int ch); 若ch是空格(' '),水平製表符('/t'),回車符('/r'),走紙換行('/f'),垂直製表符('/v'),換行符('/n'),返回非0值,否則返回0。
int isxdigit(int ch); 若ch是16進制數('0'-'9','A'-'F','a'-'f')返回非0值,否則返回0。
課後作業
1、研究ascii碼錶,重點關心幾個問題:
1)字母'A'-'Z'、'a'-'z'和數字'0'-'9'的ascii碼值是不是連續的?
2)字母'A'和'a'、'Z'和'z'的ascii碼值的差是多少?
2、根據上面的研究結果,自己編寫函數,實現字符操作常用的庫函數的功能,函數的聲明如下:
int ISALPHA(int ch); // 若ch是字母('A'-'Z','a'-'z')返回非0值,否則返回0。
int ISALNUM(int ch); // 若ch是字母('A'-'Z','a'-'z')或數字('0'-'9'),返回非0值,否則返回0。
int ISDIGIT(int ch); // 若ch是數字('0'-'9')返回非0值,否則返回0。
int ISLOWER(int ch); // 若ch是小寫字母('a'-'z')返回非0值,否則返回0。
int ISUPPER(int ch); // 若ch是大寫字母('A'-'Z')返回非0值,否則返回0。
int TOLOWER(int ch); // 若ch是大寫字母('A'-'Z')返回相應的小寫字母('a'-'z')。
int TOUPPER(int ch); // 若ch是小寫字母('a'-'z')返回相應的大寫字母('A'-'Z')
3、自定義一個函數,函數名是ctoi,利用ASCII碼的運算,把字符的'0'、'1'、'2'、'3'、'4'、'5'、'6'、'7'、'8'、'9'轉換爲整數的0、1、2、3、4、5、6、7、8、9。函數的聲明如下:
int ctoi(const char chr);
chr爲用字符方式表示的數字,函數的返回值爲數字的整數。
提示:不允許用if和switch語句,只能用ASCII碼運算。
調用示例:
printf("'0' is %d\n",ctoi('0')); // 輸出結果是'0' is 0
printf("'9' is %d\n",ctoi('9')); // 輸出結果是'9' is 9
4、編寫示例程序,測試char和unsigned char賦值超過取值範圍的後果。