2009-04-16 22 views
6

任何人都可以請解釋字符常量\ 000和\ xhh的用法,即八進制數字和十六進制數字中的字符常量嗎?字符常量: 000 xhh

回答

2

在C中,字符串由一個字符結束零值(0)。這可能是這樣寫的:

char zero = 0; 

但這在字符串內不起作用。在字符串文字中使用了一種特殊的語法,其中反斜槓作爲轉義序列的引入,並且後面跟着各種各樣的東西。

一個這樣的序列是「反斜槓零」,它只是一個值爲零的字符。因此,你可以這樣寫:

char hard[] = "this\0has embedded\0zero\0characters"; 

另一個序列使用反斜槓後跟字母'x'和一個或兩個十六進制數字,表示與指定的代碼的字符。使用這種語法,您可以將零字節寫爲'\x0'

編輯:重新閱讀這個問題,也支持這樣的基數爲八的常量,即八進制。他們使用一個反斜槓後跟數字零,就像八進制文字整數常量一樣。 '\00'因此是'\0'的同義詞。

當您需要構造一個包含非打印字符或特殊控制字符的字符串時,這有時很有用。

還有一組單字符的「已命名」特殊字符,例如換行符爲'\n',換行符爲'\t',依此類推。

+0

如果你想寫 「這\ 0has \ 00字符」? \ 00會被解釋爲一個字節'\ 0'還是'\ 0','0'?八進制轉義序列長度的限制是多少? – strager 2009-04-16 11:54:55

2

八路是基座8(使用數字0-7),所以每一個數字是3個比特:

\ 0354 = 11 101 100

十六進制是基座16(使用數字0-9,AF)和每個數字是4位:

\ X23 = 0010 0011

裏面C字符串(字符數組/指針),它們通常被用於編碼不能容易地表示字節。

所以,如果你想它使用像STX和ETX的ASCII碼字符串,你可以這樣做:

char *msg = "\x02Here's my message\x03"; 
4

這些將被用於在編輯器中寫入否則不可打印的字符。對於標準字符,這將是各種控制字符,對於wchar,它可能是未在編輯器字體中表示的字符。

例如,這個編譯在Visual Studio 2005:

const wchar_t bom = L'\xfffe';  /* Unicode byte-order marker */ 
    const wchar_t hamza = L'\x0621'; /* Arabic Letter Hamza */ 
    const char start_of_text = '\002'; /* Start-of-text */ 
    const char end_of_text = '\003'; /* End-of-text */ 

編輯:用八進制字符文字有一個有趣的警告。八進制數字通常不會超過三位數字,這會人爲地限制我們可以輸入的字符。

例如:

 /* Letter schwa; capital unicode code point 0x018f (octal 0617) 
     *    small unicode code point 0x0259 (octal 1131) 
     */ 
    const wchar_t Schwa2 = L'\x18f'; /* capital letter Schwa, correct */ 
    const wchar_t Schwa1 = L'\617';  /* capital letter Schwa, correct */ 
    const wchar_t schwa1 = L'\x259'; /* small letter schwa, correct */ 
    const wchar_t schwa2 = L'\1131'; /* letter K (octal 113), incorrect */