2012-04-19 133 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更清晰或者更清晰,但它至少会摆脱',字符。