逃逸序列差异

时间:2012-05-06 13:55:30

标签: c escaping sequence

 #include<stdio.h>
 int main()
 {
          int i=0;
          printf("%d:%4d\n",++i,'\1');
          printf("%d:%4d\n",++i,'\2');
          printf("%d:%4d\n",++i,'\3');
          printf("%d:%4d\n",++i,'\4');
          printf("%d:%4d\n",++i,'\5');
          printf("%d:%4d\n",++i,'\6');
          printf("%d:%4d\n",++i,'\7');
          printf("%d:%4d\n",++i,'\8');
          printf("%d:%4d\n",++i,'\9');
          printf("%d:%4d\n",++i,'\10');
          printf("%d:%4d\n",++i,'\11');
          printf("%d:%4d\n",++i,'\12');
          printf("%d:%4d\n",++i,'\13');
          printf("%d:%4d\n",++i,'\14');
          printf("%d:%4d\n",++i,'\15');
          printf("%d:%4d\n",++i,'\16');
          printf("%d:%4d\n",++i,'\17');
          printf("%d:%4d\n",++i,'\18');
          printf("%d:%4d\n",++i,'\19');
          printf("%d:%4d\n",++i,'\20');
          printf("%d:%4d\n",++i,'\21');
          printf("%d:%4d\n",++i,'\22');
          printf("%d:%4d\n",++i,'\23');
          printf("%d:%4d\n",++i,'\24');
          printf("%d:%4d\n",++i,'\25');
          printf("%d:%4d\n",++i,'\26');
          printf("%d:%4d\n",++i,'\27');
          printf("%d:%4d\n",++i,'\28');
          printf("%d:%4d\n",++i,'\29');
          printf("%d:%4d\n",++i,'\30');
          return 0;
 }

输出:

1:   1
2:   2
3:   3
4:   4
5:   5
6:   6
7:   7
8:  56    
9:  57
10:   8
11:   9
12:  10
13:  11
14:  12
15:  13
16:  14
17:  15
18: 312
19: 313
20:  16
21:  17
22:  18
23:  19
24:  20
25:  21
26:  22
27:  23
28: 568
29: 569
30:  24

'\ 1'是否等同于ASCII值为1的字符? 在输出中,为什么数字在8,9,18,19,28,29 ......不按顺序排列? http://codepad.org/I1N6A71j

5 个答案:

答案 0 :(得分:2)

转义序列应该是八进制的,因此不允许使用\ 8和\ 9并导致未指定的行为。 结果取决于您使用的编译器;在这种情况下,它忽略了转义并将'8'和'9'作为简单的ascii-char处理。

要获得正确的(ascii-char)结果,您应该使用\ x8和\ x9。

答案 1 :(得分:2)

从2.14.3开始:

  

转义\ooo由反斜杠后跟一个,两个或三个八进制数字组成,用于指定所需字符的值。转义\xhhh由反斜杠后跟x后跟一个或多个十六进制数字组成,这些数字用于指定所需字符的值。十六进制序列中的位数没有限制。八进制或十六进制数字序列由分别不是八进制数字或十六进制数字的第一个字符终止。

由于\8\18不是有效的八进制序列,因此这些文字的含义取决于您的平台:

  

表7中未列出反斜杠后面的字符的转义序列是有条件支持的,具有实现定义的语义。

答案 2 :(得分:1)

这是编译器输出(MinGW):

a.c: In function 'main':
a.c:12:33: warning: unknown escape sequence: '\8'
a.c:13:33: warning: unknown escape sequence: '\9'
a.c:22:33: warning: multi-character character constant
a.c:23:33: warning: multi-character character constant
a.c:32:33: warning: multi-character character constant
a.c:33:33: warning: multi-character character constant

其中一些转义序列在c中无效。转义序列在C中为八进制。如果你有一个像样的编辑器,你也可以很容易地检测到它。我的ViM标记为\8\9为红色,因为它们无效。

答案 3 :(得分:0)

\之后的数字被视为八进制。我不知道为什么\8\9\19等序列如此奇怪。由于它们不是有效的八进制数,编译器可能可以自由地使用它们。

如果您愿意,可以使用十六进制指定转义序列,如\x1\x2等。

答案 4 :(得分:0)

在格式化d modifyingator之前使用hh !!!所以你使用d格式它假设int32值,但你只使用char - 8位值!它的记忆错误!只有c99或c ++ 11。 或者你需要一些像这样的中间值:

short val = '\1'; //for C 89
  printf("%d:%4hd\n",++i, val);
val =  '\2';
  printf("%d:%4d\n",++i,val);
......
or 
  printf("%d:%4hhd\n",++i,'\1'); //for c99 

要么不能正常工作!!!