山東大學 楊哲敏(資料庫)
C語言中的轉義字元
在字符集中,有一類字元具有這樣的特性:當從鍵盤上輸入這個字元時,顯示器上就可以顯示這個字元,即輸入什麼就顯示什麼。這類字元稱為可顯示字元,如a、b、c、$、+和空格符等都是可顯示字元。
另一類字元卻沒有這種特性。它們或者在鍵盤上找不到對應的一個鍵(當然可以用特殊方式輸入),或者當按鍵以後不能顯示鍵面上的字元。其實,這類字元是為控制作用而設計的,故稱為控制字元。
在C語言中,構成字元常量的控制字元必須用轉義字元表示。轉義字元是一種以“/”開頭的字元。例如退格符用'/b'表示,換行符用'/n'表示。轉義字元中的'/'表示它後面的字元已失去它原來的含義,轉變成另外的特定含義。反斜槓與其後面的字元一起構成一個特定的字元。
轉義字元是C語言中表示字元的一種特殊形式。轉義字元以反斜'/'開頭,後面跟一個字元或一個八進位制或十六進位制數表示。轉義字元具有特定的含義,不同於字元原有的意義,故稱轉義字元。
通常使用轉義字元表示ASCII碼字符集中不可列印的控制字元和特定功能的字元,如用於表示字元常量的單撇號('),用於表示字串常量的雙撇號(")和反斜槓(/)等。
例如,下面例子printf函式的格式串中用到的'/n'就是一個轉義字元,其意義是“回車換行”。轉義字元主要用來表示那些用一般字元不便於表示的控制程式碼。
常用的轉義字元及其含義
從表中可以看出,在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。
可見,字符集中的所有字元都可以用十六進位制轉義字元表示。
由上可知,使用八進位制轉義字元和十六進位制轉義字元,不僅可以表示控制字元,而且也可以表示可顯示字元。但由於不同的計算機系統上採用的字符集可能不同,因此,為了能使所編寫的程式可以方便地移植到其他的計算機系統上執行,程式中應少用這種形式的轉義字元。
轉義字元的使用
例:
void main()
{
int a,b,c;
a=5; b=6; c=7;
printf("%d/n/t%d %d/n %d %d/t/b%d/n",a,b,c,a,b,c);
}
此程式練習轉義字元的使用:
a、b、c分別為整數5,6,7
呼叫printf顯示程式執行結果:
5
67
56 7
程式在第一列輸出a值5之後就是“/n”,故回車換行;接著又是“/t”,於是跳到下一製表位置(設製表位置間隔為8),再輸出b值6和c 值7;後又是"/n",因此再回車換行;之後又輸出a值5和b值6;再次後"/t"跳到下一製表位置(與上一行的6 對齊),但下一轉義字元“/b”又使退回一格,故緊挨著6再輸出c值7。
使用轉義字元時需要注意以下問題:
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” 長度為0。(想想:為什麼不是2)