c中的转义序列

时间:2011-01-16 08:22:09

标签: c

int main()
   {       char *arr="\\0\1\8234\0"; int i=0;
           while(arr[i])
           {        switch(arr[i])
                    {
                            case '0': printf("is no"); break;
                            case '00': printf("is debugging\n"); break;
                            case 0: printf("It is Avishkar\n"); break;
                            case '\\': printf("This "); break;
                            case '\1': printf("t s"); break;
                            case '8': printf("o s"); break;
                            case '2': printf("imp"); break;
                            case '3': printf("le as"); break;
                            case 2: case 3: case 4:
                            case 8: printf("This "); break;
                            default: printf(" it seems\n"); break;}
                    i++; } }

请解释o / p? 我无法得到它..

5 个答案:

答案 0 :(得分:4)

打破我们的字符串初始化:

\\ == literal \ character
\1 == octal representation of integer "1"
\8 == technically invalid standard C, microsoft compilers will treat an
unsupported (i.e. non-octal, non-escape, non-hex-specifier) character after
a slash as if the slash were not present, so this is ascii '8'
2 == ascii '2'
3 == ascii '3'
4 == ascii '4'
\0 == literal zero
arr[ 0 ] = '\\';   // literal backslash
arr[ 1 ] = '0';    // ascii '0'
arr[ 2 ] = 1;      // integer 1
arr[ 3 ] = '8';      // using microsoft (non-portable) syntax
arr[ 4 ] = '2';     // ascii '2'
arr[ 5 ] = '3';     // ascii '3'
arr[ 6 ] = '4';     // ascii '4'
arr[ 7 ] = 0;       // integer 0

循环打印i的每个连续值:

i == 0: "This "
i == 1: "is no"
i == 2: "t s"
i == 3: "o s"
i == 4: "imp"
i == 5: "le as"
i == 6: "it seems"

字面上:

这并不像看起来那么简单

尾随\ 0将导致while(arr [i])失败,并且当i == 7时循环停止。

虽然这可能会导致编译器在非Microsoft编译器上抱怨。

答案 1 :(得分:1)

\\意味着只是削减字符。 \1表示代码为1的字符。\8很棘手 - 它会产生斜杠和8,因为\需要八进制,而8不是有效的八进制数字。最后的\0是多余的,因为C常量字符串自动以\0结尾,但它会产生代码为0的字符,在C中表示字符串的结尾。

通常,在C字符串\xxx中,xxx是八进制数字表示带有代码xxx的字符 - 例如\12表示代码为10的字符(八进制12)。

答案 2 :(得分:0)

通常,\ 0转义是char值0 - 用于标记char*样式字符串结尾的空终止符。像“foo”这样的文字会被编译器自动终止;只有当你构造一个带有初始化语法(char foo[] = { 'a', 'b', 'c', '\0'};)的char数组时,你才需要明确地使用\ 0。在这种情况下,你也可以使用整数文字0(没有引号)。

嵌入空值的大多数其他事件都是特定于上下文的。例如,一些Win32 API函数期望char数组以空值终止以指示列表中项目之间的分隔,然后双空终止以指示列表的结尾。您的示例代码似乎不是这种情况。

您的示例代码似乎是一些有意混淆的代码,只是打印一条简单的消息。 \ 0似乎是一个红色的鲱鱼 - 这是不必要的。当arr [i]为'4'时,代码将打印'似乎\ n'并递增i,因此arr [i]现在是\ 0。这相当于0,这将导致while循环终止,无论如何由于字符串中的隐式空终止符而发生。

N.B。代码使用一些可疑的东西,如多字符文字和\ 8转义。我不确定它是否会按预期发挥作用。

答案 3 :(得分:0)

从你的代码:

\\ - \ (Slash character)
\0 - 0 (Null-terminated character which simply appends '0')

注意:\ 0永远不是case语句,因为当while(0)结束你的循环时。

答案 4 :(得分:0)

什么是转义

char *arr="\\0\1\8234\0"; int i=0;
  • \\是一个转义反斜杠。 (之后的零是转义。)​​

  • \1表示八进制ASCII码1的字符。(\8是无效的转义码;流行的GCC编译器忽略反斜杠,但不应该依赖于该行为。)

  • \0表示一个空字节,它是用于终止C字符串的字符。 C编译器会在双引号末尾自动添加另一个空字节串;在您的情况下,没有必要明确包含它。

计划流程

程序迭代字符串中的字符,直到它到达第一个空字节,即字符串结尾的标记(while(arr[i]) { ... i++; })。对于每一个,它使用switch语句将其与其他几个值进行比较。

因此,程序的输出为"This is not so simple as it seems\n"

线条从未执行

此行永远不会执行,因为控件在此之前会离开while循环:

case 0: printf("It is Avishkar\n"); break;

请注意,因为零不是单引号作为字符文字,所以它引用字符代码,而不是表示的实际字符。

这些行也没有执行:

case '00': printf("is debugging\n"); break;
case 8: printf("This "); break;

前者使用多字符文字(不要与双引号字符串混淆),它具有实现定义的行为。 GCC将字符打包成int,因此该编译器的结果值为12336。当然,它不等于在字符串中找到的任何字符值;看到这个编译器警告:

  

prog.c:7:警告:案例标签值超过类型

的最大值

后者指的是十进制ASCII码8.如上所述,这与'8'不同。