C語言中的轉義字符
在字符集中,有一類字符具有這樣的特性:當從鍵盤上輸入這個字符時,顯示器上就可以顯示這個字符,即輸入什么就顯示什么。這類字符稱為可顯示字符,如a、b、c、$、+和空格符等都是可顯示字符。
另一類字符卻沒有這種特性。它們或者在鍵盤上找不到對應的一個鍵(當然可以用特殊方式輸入),或者當按鍵以后不能顯示鍵面上的字符。其實,這類字符是為控制作用而設計的,故稱為控制字符。
在C語言中,構成字符常量的控制字符必須用轉義字符表示。轉義字符是一種以“/”開頭的字符。例如退格符用'/b'表示,換行符用'/n'表示。轉義字符中的'/'表示它后面的字符已失去它原來的含義,轉變成另外的特定含義。反斜杠與其后面的字符一起構成一個特定的字符。
轉義字符是C語言中表示字符的一種特殊形式。轉義字符以反斜'/'開頭,后面跟一個字符或一個八進制或十六進制數表示。轉義字符具有特定的含義,不同於字符原有的意義,故稱轉義字符。
通常使用轉義字符表示ASCII碼字符集中不可打印的控制字符和特定功能的字符,如用於表示字符常量的單撇號('),用於表示字符串常量的雙撇號(")和反斜杠(/)等。
例如,下面例子printf函數的格式串中用到的'/n'就是一個轉義字符,其意義是“回車換行”。轉義字符主要用來表示那些用一般字符不便於表示的控制代碼。
常用的轉義字符及其含義
轉義字符 意義 ASCII碼值(十進制)
\a 響鈴(BEL) 007
\b 退格(BS) ,將當前位置移到前一列 008
\f 換頁(FF),將當前位置移到下頁開頭 012
\n 換行(LF) ,將當前位置移到下一行開頭 010
\r 回車(CR) ,將當前位置移到本行開頭 013
\t 水平制表(HT) (跳到下一個TAB位置) 009
\v 垂直制表(VT) 011
\\ 代表一個反斜線字符''\' 092
\' 代表一個單引號(撇號)字符 039
\" 代表一個雙引號字符 034
\0 空字符(NULL) 000
\ddd 1到3位八進制數所代表的任意字符 三位八進制
\xhh 1到2位十六進制所代表的任意字符 二位十六進制
從表中可以看出,在C語言中有三種轉義字符,它們是:一般轉義字符、八進制轉義字符和十六進制轉義字符。
1. 一般轉義字符
這種轉義字符,雖然在形式上由兩個字符組成,但只代表一個字符。常用的一般轉義字符為:
\a \n \t \v \b \r \f \\ \’ \"
細心的讀者可能已經發現,轉義字符'\\'代表的反斜杠"\"、轉義字符’\’’代表的字符"'"和轉義字符'\"'代表的字符""",其本身就是可顯示字符,為什么還要對它轉義呢?
這是因為它們的原有的字符形式已作它用,其中,單引號用作區分字符常量的括號,雙引號用作區分字符串(下面將要介紹字符串)的括號,而反斜杠本身已用來表示轉義字符的開頭,因此必須對它們用轉義字符重新聲明。
2. 八進制轉義字符
它是由反斜杠'\'和隨后的1~3個八進制數字構成的字符序列。例如,'\60'、'\101'、'\141'分別表示字符'0'、'A'和'a'。因為字符'0'、'A'和'a'的ASCII碼的八進制值分別為60、101和141。
字符集中的所有字符都可以用八進制轉義字符表示。
如果你願意,可以在八進制數字前面加上一個0來表示八進制轉移字符。
3. 十六進制轉義字符
它是由反斜杠'\'和字母x(或X)及隨后的1~2個十六進制數字構成的字符序列。例如,'\x30'、'\x41'、'\X61'分別表示字符'0'、'A'和'a'。因為字符'0'、'A'和'a'的ASCII碼的十六進制值分別為0x30、0x41和0x61。
可見,字符集中的所有字符都可以用十六進制轉義字符表示。
由上可知,使用八進制轉義字符和十六進制轉義字符,不僅可以表示控制字符,而且也可以表示可顯示字符。但由於不同的計算機系統上采用的字符集可能不同,因此,為了能使所編寫的程序可以方便
地移植到其他的計算機系統上運行,程序中應少用這種形式的轉義字符。
使用轉義字符時需要注意以下問題:
1)轉義字符中只能使用小寫字母,每個轉義字符只能看作一個字符。
2)/v垂直制表和/f換頁符對屏幕沒有任何影響,但會影響打印機執行響應操作。
3)在C程序中,使用不可打印字符時,通常用轉義字符表示。
4)轉義字符’/0’表示空字符NULL,它的值是0。而字符'0'的ASCII碼值是48。因此,空字符’/0’不是字符0。另外,空字符不等於空格字符,空格字符的ASCII碼值為32而不是0。編程序時,讀者應當區別清楚。
5) 如果反斜線之后的字符和它不構成轉義字符,則’/’不起轉義作用將被忽略。
例如:
printf(“a/Nbc/nDEF/n”);
輸出:
aNbc
DEF
6)轉義字符也可以出現在字符串中,但只作為一個字符看待。
例 求下面字符串的長度
“/026[12,m” 長度為6
“/0mn” 長度為1。(想想:為什么不是2)