Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+的规则+;字符串文字转义字符_C++_String_Escaping - Fatal编程技术网

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
    =
    \x1B
    =转义(非标准GCC扩展)
标点符号:

  • \”
    =引号(对于
    '”
    ,不需要反斜杠)
  • \'
    =撇号(
    “”
    )不需要反斜杠)
  • \?
    =问号(用于避免三角图)
  • \\
    =反斜杠
数字字符引用:

  • \
    +最多3个八进制数字
  • \x
    +任意数量的十六进制数字
  • \u
    +4个十六进制数字(Unicode BMP,C++11中新增)
  • \U
    +8个十六进制数字(Unicode星体平面,C++11中新增)
\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”