直接打印转义字符及其与ASCII表的关系

时间:2015-10-21 18:30:06

标签: c escaping ascii

当我遇到一些我以前没见过的东西时,我正在查看strace电话的输出。示例输出如下(从调用recv到详细说明):

recv(13, "%\0\0\0\23\0\1\0\5\0\0\0\0\0\0\0\0\0\0\0\26\0\0\0\0\0\0\0\0\0\0\0\5\0\20\0\5", 37, 0)

其他结果如下:

recv(10, "OK\n", 3, 0)

无论实际的recv意图传达什么,我都注意到发送的每个字符都被转义了。我认为也许这些转义字符与ASCII Table以一对一的方式相关(即\10等同于\n)。

所以,快速测试如下:

printf("Before newline \10  After newline);

给出以下结果:

Before newline   After newline

然后我尝试以十进制形式打印字符本身的值:

printf("Value: %d", '\10');

给出结果:

Value: 8 

所以,当然,因为差异是我试过的两个:

printf("Before newline \12  After newline);

产地:

Before newline
After newline

因此,似乎这种格式的转义字符与ascii表相关,其中"少于2"关系。

  • 为什么ascii表和转义字符之间存在两个差异?

  • 这有什么意义,为什么它会以这种方式运作?

  • 这只是strace的细微差别吗?

2 个答案:

答案 0 :(得分:2)

转义字符不以十进制编码。它是一到三位数的八进制数字。

C有几种形式的字符转义:

  1. 反斜杠和字符说明符(例如'\n',' \r'等。)
  2. 反斜杠和1到3位数字(八进制说明符,数字不得为8或9.即'\377'
  3. 反斜杠和x,然后是十六进制数字(即'\x40'
  4. 反斜杠和u,然后是十六进制数字(Unicode常量)
  5. 八进制中的

    10是十进制的8,因此是你的结果。没有一个"少于两个"但是,因为20八进制是16十进制,30八进制是24十进制等等。

答案 1 :(得分:1)

strace使用标准的C字符串表示法,其中后跟数字的反斜杠是 octal 字符代码。

10八进制= 8十进制
12八进制= 10十进制