C ++字符串文字的规则转义字符

时间:2012-04-19 01:23:17

标签: c++ string escaping

字符串文字中转义字符\的规则是什么?是否有转义的所有字符的列表?

特别是,当我在gedit中的字符串文字中使用\并按照任意三个数字跟随它时,它会以不同的方式对它们进行着色。

我尝试创建一个由文字构建的std::string,其字符为0,后跟空字符(\0),后跟字符0。但是,语法突出显示警告我,这可能会创建类似于字符0后跟空字符(\00,又名\0)的东西,也就是说,只有两个字符。

对于这个问题的解决方案,这是最好的方法:

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

对于字符串文字中的转义字符一般有什么参考吗?例如什么是'\ a'?

6 个答案:

答案 0 :(得分:58)

控制字符:

(十六进制代码假定与ASCII兼容的字符编码。)

  • \a = \x07 =提醒(铃声)
  • \b = \x08 =退格
  • \t = \x09 =水平标签
  • \n = \x0A =换行(或换行)
  • \v = \x0B =垂直标签
  • \f = \x0C =表单Feed
  • \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"

答案 1 :(得分:4)

\a是铃声/提示字符,在某些系统上触发声音。 \nnn表示八进制基数中的任意ASCII字符。但是,\0的特殊之处在于无论如何都代表空字符。

要回答原始问题,您也可以将'0'字符转义为:

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

(因为ASCII'0'是八进制的60)

MSDN documentation上有一篇非常详细的文章,cppreference

答案 2 :(得分:4)

如果后面跟着其他数字,

\ 0将被解释为八进制转义序列,因此\ 00将被解释为单个字符。 (\ 0技术上也是一个八进制转义序列,至少在C中)。

你这样做的方式:

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

有效,因为此版本的构造函数采用char数组;如果您尝试将“0 \ 0”“0”作为常量字符*传递,它会将其视为C字符串,并且仅将所有内容复制到空字符。

这是list of escape sequences

答案 3 :(得分:1)

我留下这样的评论,但我觉得可能需要更多的可见性,因为没有一个答案提到这个方法:

我现在更喜欢使用非打印字符初始化std::string的方法(特别是嵌入的空字符)是使用初始化列表的C ++ 11功能。

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

我不需要对我正在使用的字符数进行容易出错的手动计数,所以如果以后我想在某处插入'\ 013',我可以和我的所有代码仍然有效。它还完全避免了意外使用错误转义序列的任何问题。

唯一的缺点是所有额外的',字符。

答案 4 :(得分:0)

借助用户定义的文字的魔力,我们还有另一个解决方案。 C ++ 14添加了一个std::string文字运算符。

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

构造一个长度为2的字符串,其中'\ 0'字符(null)后跟一个'0'字符(数字零)。我不确定它是否比initializer_list<char> constructor approach更清晰,但它至少会删除',个字符。

答案 5 :(得分:0)

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