C++ C+的规则+;字符串文字转义字符
字符串文本中转义字符C++ C+的规则+;字符串文字转义字符,c++,string,escaping,C++,String,Escaping,字符串文本中转义字符\的规则是什么?是否有所有转义字符的列表 特别是,当我在gedit中的字符串文本中使用\并在其后跟随任意三个数字时,它们的颜色会有所不同 我试图创建一个std::string,它是由一个文本构造而成的,该文本的字符0后跟空字符(\0),后跟字符0。但是,语法突出显示提醒我,这可能会创建类似字符0,后跟空字符(\00,又称\0),也就是说,只有两个字符 要解决这一问题,这是最好的方法吗: std::string ("0\0" "0", 3) // String concate
\
的规则是什么?是否有所有转义字符的列表
特别是,当我在gedit中的字符串文本中使用\
并在其后跟随任意三个数字时,它们的颜色会有所不同
我试图创建一个std::string
,它是由一个文本构造而成的,该文本的字符0
后跟空字符(\0
),后跟字符0
。但是,语法突出显示提醒我,这可能会创建类似字符0
,后跟空字符(\00
,又称\0
),也就是说,只有两个字符
要解决这一问题,这是最好的方法吗:
std::string ("0\0" "0", 3) // String concatenation
对于转义字符通常在字符串文本中的作用,是否有一些参考?例如,“\a”是什么?
\a
是铃声/警报字符,在某些系统上会触发声音<代码>\nnn,表示八进制中的任意ASCII字符。但是,\0
的特殊之处在于,无论发生什么情况,它都表示空字符
要回答原始问题,还可以转义“0”字符,以及:
std::string ("\060\000\060", 3);
(因为ASCII“0”的八进制为60)
有一篇关于这方面的非常详细的文章,\0如果后跟其他数字,将被解释为八进制转义序列,因此\00将被解释为单个字符。(\0在技术上也是一个八进制转义序列,至少在C中是这样) 你这样做的方式:
std::string ("0\0" "0", 3) // String concatenation
之所以有效,是因为此版本的构造函数采用char数组;如果您尝试将“0\0”“0”作为常量字符*传递,它会将其视为C字符串,并且只复制所有内容直到空字符
下面是一个。控制字符: (十六进制代码采用ASCII兼容字符编码。)
=\a
=警报(铃声)\x07
=\b
=退格\x08
=\t
=水平选项卡\x09
=\n
=换行符(或换行符)\x0A
=\v
=垂直选项卡\x0B
=\f
=表单提要\x0C
=\r
=回车\x0D
=\e
=转义(非标准GCC扩展)\x1B
=引号(对于\”
,不需要反斜杠)'”
=撇号(\'
)不需要反斜杠)“”
=问号(用于避免三角图)\?
=反斜杠\\
+最多3个八进制数字\
+任意数量的十六进制数字\x
+4个十六进制数字(Unicode BMP,C++11中新增)\u
+8个十六进制数字(Unicode星体平面,C++11中新增)\U
\0
=\00
=\000
=空字符的八进制ecape
如果您确实希望在
\0
之后有一个实际的数字字符,那么是的,我建议使用字符串连接。请注意,文本各部分之间的空格是可选的,因此您可以编写“\0”“0”
我留下了类似的注释,但我觉得可能需要更多的可见性,因为没有任何答案提到此方法:
我现在更喜欢使用非打印字符(特别是嵌入的空字符)初始化std::string
,方法是使用初始化器列表的C++11功能
std::string const str({'\0', '6', '\a', 'H', '\t'});
<>我不需要对我正在使用的字符进行错误的手动计数,因此如果稍后我想在某个中间插入一个“013”,我可以并且我的所有代码仍然有效。它还完全避免了意外使用错误的逃生顺序的问题
唯一的缺点是所有这些额外的
,
和,
字符。借助用户定义文字的魔力,我们有了另一个解决方案。C++14添加了std::string
literal运算符
using namespace std::string_literals;
auto const x = "\0" "0"s;
构造一个长度为2的字符串,后跟一个“\0”字符(null)和一个“0”字符(数字零)。我不确定它是否比
初始值设定项列表
更清晰,但它至少去掉了
和,
字符。ascii
是linux上可以下载的软件包。
例如
sudo apt get安装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
相关代码,了解如何使用。最好的解决方案是像以前一样使用串联。如果需要单个`只需使用\`。看起来我也可以使用初始值设定项列表语法:std::string{0',0',0'}
我不仅可以使用初始值设定项列表语法,现在我强烈推荐使用它,而不是任何其他需要指定大小或使用转义字符的字符串构造方法。想想我现在意识到的微妙的未定义的行为,现在我的评论在1:32完全混淆了…我不知道我的意思是什么…这个例子使用构造函数字符串(constchar*s),它将s视为C字符串。OP的示例使用字符串(const char*s,size\t n),该字符串将其视为一个字符数组。在\x
的情况下,十六进制数字将被“贪婪地”读取,直到第一个非十六进制数字(也就是说,不限于您可能期望的2,以及一些语法高亮显示者所假定的2)。您可以使用@dan04拆分字符串的技巧来标记十六进制的结尾:“\x0020”“FeedDadBeer”
,而不是“\x0020FeedDadBeer”