[英]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.