2012-04-19 134 views
33

字符串文字中轉義字符\的規則是什麼?是否有所有逃脫的角色列表?C++字符串文字轉義規則

特別是,當我在gedit的字符串文字中使用\,並按任意三個數字跟着它時,它以不同的顏色着色它們。

我試圖創建一個從字面結構與後跟空字符(\0)字0一個std::string,其次是性格0。但是,語法突出顯示提醒我可能會創建類似字符0後跟空字符(\00,又名\0),也就是說,只有兩個字符。

爲了解決僅這一個問題,這是做到這一點的最好辦法:

std::string ("0\0" "0", 3) // String concatenation 

而且是有什麼樣的轉義字符確實在字符串中一般有一定的參考?例如,'\ a'是什麼?

+0

相關,關於如何[轉義轉義序列](http://stackoverflow.com/questions/8229521/how-to-escape-or-terminate-an-escape-sequence-in-c)。最好的解決方案是像你一樣使用串聯。 – MPelletier 2012-04-19 01:31:29

+0

如果你需要一個'\',只需使用'\\'。 – MPelletier 2012-04-19 01:32:11

+0

它看起來像我也可以使用初始化列表語法:'std :: string {'0',0,'0'};' – 2012-04-19 04:49:31

回答

48

控制字符:

(十六進制代碼假定一個ASCII兼容字符編碼。)

  • \a = \x07 =警報(鐘形)
  • \b = \x08 =退格
  • \t = \x09 =臥式標籤
  • \n = \x0A =換行符(或換行)
  • \v = \x0B =垂直標籤
  • \f = \x0C =形式飼料
  • \r = \x0D =回車
  • \e = \x1B =逃逸(非標準GCC擴展)

標點字符:

  • \" =報價標記('"'不需要反斜槓)
  • (反斜槓不需要 "'"
  • \? =問號
  • \' =撇號(用於避免三字母)
  • \\ =反斜槓

數字字符引用:

  • \ +最多3個八進制數字
  • \x +任何數目的十六進制數字
  • \u + 4個十六進制數字(Unicode的BMP,新在C++ 11)
  • \U + 8個十六進制數字(Unicode的星光層,新在C++ 11)

\0 = \00 = \000 =八進制ecape爲空字符

如果你想一個\0後的實際數字字符,那麼,我建議字符串連接。請注意,文字部分之間的空格是可選的,因此您可以編寫"\0""0"

+15

在'\ x'的情況下,十六進制數字將被'貪婪'讀取,直到第一個非十六進制數字爲止(也就是說,不限於2,如您所期望的那樣,以及某些語法熒光筆*做*假設)。你可以使用分割字符串的@ dan04技巧來標記十六進制的結尾:'「\ x0020」「FeedDadBeer」「而不是'」\ x0020FeedDadBeer「'。 – Rhubbarb 2012-09-04 10:24:36

+0

那麼是什麼由'\ x'表示,然後是奇數個hexits?一個假設對於一個偶數,每個hexit表示從最高到最低的順序的一個內存半字節 - 因此'\ x5f'是'01011111'而不是'11110101';但那麼這是否意味着'\ x5'是'01010000'而不是'00000101'?那麼'\ x5f5'呢?那是'01011111 01010000'還是'01011111 00000101'? – eggyal 2014-12-06 11:54:00

+1

我不知道這是否會驗證它自己的問題,但我已經收到來自某個源的字符串數據,其中包含'「\ e」'。我沒有看到它在任何參考文獻中列出,它可以等同於'\ x1B'嗎? – 2016-04-20 12:32:17

4

\a是鈴聲/提醒字符,在某些系統上會觸發聲音。代表一個任意的八進制ASCII字符。但是,\0的特殊之處在於它無論如何都表示空字符。

要回答你原來的問題,你無法逃脫你的 '0' 字爲好,如:

std::string ("\060\000\060", 3); 

(因爲一個ASCII '0' 是八進制的60)

MSDN documentation有非常詳細的文章,以及cppreference

+0

該示例使用構造函數字符串(const char * s),該字符串像C字符串一樣處理。 OP的例子使用字符串(const char * s,size_t n),它將它當作一個字符數組來處理。 – mgiuffrida 2012-04-19 01:47:51

+0

@eli你在編輯它之前是否看到我的答案? – jli 2012-04-19 02:02:13

4

\ 0將被解釋爲一個八進制轉義序列,如果它跟着其他數字,所以\ 00將被解釋爲單個字符。 (\ 0在技術上也是一個八進制轉義序列,至少在C中)。因爲這個版本的構造函數需要一個字符數組

std::string ("0\0" "0", 3) // String concatenation 

工程;:

的方式你這樣做如果你試圖將「0 \ 0」「0」作爲一個常量字符*,它會將它視爲一個C字符串,並且只將所有東西都複製到空字符。

這是list of escape sequences

1

我離開這樣的事情作爲一個評論,但我覺得它可能需要更多的可見度,沒有一個答案提到這個方法:

我現在更喜歡在一般初始化與非打印字符的std::string方法(特別是嵌入的空字符)是使用初始化程序列表的C++ 11功能。

std::string const str({'\0', '6', '\a', 'H', '\t'}); 

我不要求執行,我現在用的字符數的容易出錯的手動計數,這樣,如果以後我要插入一個「\ 013」在中間的某個地方,我可以和我所有的代碼仍然可以工作。它也完全避免了偶然使用錯誤轉義序列的任何問題。

唯一的缺點是所有這些額外的',個字符。

0

隨着用戶定義的文字的魔力,我們還有另一種解決方案。 C++ 14增加了一個std::string文字運算符。

using namespace std::string_literals; 
auto const x = "\0" "0"s; 

構造一個長度爲2的字符串,其中'\ 0'字符(空)後跟一個'0'字符(數字零)。我不確定它是否比initializer_list<char>constructor approach更清晰或者更清晰,但它至少會擺脫',字符。