簡體   English   中英

C++ 字符串文字轉義字符的規則

[英]Rules for C++ string literals escape character

字符串文字中轉義字符\的規則是什么? 是否有所有轉義字符的列表?

特別是,當我在 gedit 中的字符串文字中使用\並在其后跟任意三個數字時,它們的 colors 會有所不同。

我試圖創建一個std::string ,它由字符0后跟 null 字符( \0 )和字符0的文字構成。 但是,語法突出顯示提醒我,這可能會創建類似於字符0后跟 null 字符( \00 ,又名\0 )的東西,也就是說,只有兩個字符。

為了解決這個問題,這是最好的方法:

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

對於轉義字符在字符串文字中的作用,是否有一些參考? 例如,'\a' 是什么?

控制字符:

(十六進制代碼采用與 ASCII 兼容的字符編碼。)

  • \\a = \\x07 = 警報(鈴)
  • \\b = \\x08 = 退格
  • \\t = \\x09 = 水平制表符
  • \\n = \\x0A = 換行(或換行)
  • \\v = \\x0B = 垂直制表符
  • \\f = \\x0C = 換頁
  • \\r = \\x0D = 回車
  • \\e = \\x1B = 轉義(非標准 GCC 擴展)

標點符號:

  • \\" = 引號( '"'不需要反斜杠)
  • \\' = 撇號( "'"不需要反斜杠)
  • \\? = 問號(用於避免三合字母)
  • \\\\ = 反斜杠

數字字符參考:

  • \\ + 最多 3 個八進制數字
  • \\x + 任意數量的十六進制數字
  • \\u\u003c/code> + 4 個十六進制數字(Unicode BMP,C++11 新增)
  • \\U + 8 個十六進制數字(Unicode 星體平面,C++11 中的新功能)

\\0 = \\00 = \\000 = 空字符的八進制轉義

如果您確實想要\\0之后的實際數字字符,那么是的,我建議使用字符串連接。 請注意,文字部分之間的空格是可選的,因此您可以編寫"\\0""0"

\\a是鈴聲/警報字符,在某些系統上會觸發聲音。 \\nnn ,代表八進制的任意 ASCII 字符。 然而, \\0的特殊之處在於它無論如何都代表空字符。

要回答您的原始問題,您也可以轉義 '0' 字符,如下所示:

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

(因為 ASCII '0' 在八進制中是 60)

MSDN 文檔對此有一篇非常詳細的文章,以及cppreference

\\0 將被解釋為八進制轉義序列,如果其后跟其他數字,因此 \\00 將被解釋為單個字符。 (\\0 在技術上也是一個八進制轉義序列,至少在 C 中是這樣)。

你這樣做的方式:

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

之所以有效,是因為此版本的構造函數采用 char 數組; 如果您嘗試將 "0\\0" "0" 作為 const char* 傳遞,它會將其視為 C 字符串,並且只復制所有內容直到空字符。

這是轉義序列列表

我留下了這樣的評論作為評論,但我覺得它可能需要更多的可見性,因為沒有一個答案提到這個方法:

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

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

我不需要對我正在使用的字符數執行容易出錯的手動計數,因此如果稍后我想在中間某處插入一個 '\\013',我可以並且我的所有代碼仍然可以工作. 它還完全避免了意外使用錯誤轉義序列的任何問題。

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

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

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

構造一個長度為 2 的字符串,其中包含一個 '\\0' 字符(空),后跟一個 '0' 字符(數字零)。 我不確定它是否比initializer_list<char>構造函數方法更清楚,但它至少擺脫了',字符。

ascii是 linux 上的一個包,你可以下載。 例如sudo apt-get install ascii ascii

Usage: ascii [-dxohv] [-t] [char-alias...]
-t = one-line output  -d = Decimal table  -o = octal table  -x = hex table
-h = This help screen -v = version information
Prints all aliases of an ASCII character. Args may be chars, C \-escapes,
English names, ^-escapes, ASCII mnemonics, or numerics in decimal/octal/hex.`

此代碼可以幫助您使用 C/C++ 轉義碼,例如\\x0A

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM