关于C中字符串后面的\ 0字符(或字符?)

时间:2014-10-02 13:21:38

标签: c string sizeof

\和0字符是否存储在字符串末尾的相同位置或不同位置?

main()
{
    char x[]="Hello\0";
    char y[]="Hello12";
    char z[]="Hello\012";
    char w[]="Hello1234";

    printf("%d %d %d %d", sizeof(x), sizeof(y), sizeof(z), sizeof(w));
}

输出:

7 8 7 10

请解释代码的输出。

4 个答案:

答案 0 :(得分:8)

C字符串中的

\0是单个字符,ASCII值0。所有C字符串文字也包含一个隐式终止\0字符,无论字符串中包含哪些内容(甚至是另一个\0)。

\012是八进制字符ASCII 10(换行符)

所以:

char x[]="Hello\0";      // 5 letters + your \0 + implicit \0 == 7
char y[]="Hello12";      // 7 letters + implicit \0 == 8
char z[]="Hello\012";    // 5 letters + \012 + implicit \0 == 7
char w[]="Hello1234";    // 9 chars + implicit \0 == 10

答案 1 :(得分:1)

不,\0是一个八进制数,占据一个字符位置:

Array  Contents   Size
x      Hello\0    5 for the characters, one for the explicit \0, one for the implicit null terminator
y      Hello12    7 for the characters, one for the implicit null terminator
z      Hello\012  5 for the characters, one for the \012, one for the implicit null terminator
w      Hello1234  9 for the characters, one for the implicit null terminator

答案 2 :(得分:1)

首先,您使用的是隐式int返回类型。请停止。

接下来,解析字符串文字:

首先转换为字符,然后连接相邻的字符串,最后添加一个隐含的哨兵0。

char x[]="Hello\0";   // 'H' 'e' 'l' 'l' 'o' 0                 sentinel-0
char y[]="Hello12";   // 'H' 'e' 'l' 'l' 'o' '1'   '2'         sentinel-0
char z[]="Hello\012"; // 'H' 'e' 'l' 'l' 'o' '\012'            sentinel-0
char w[]="Hello1234"; // 'H' 'e' 'l' 'l' 'o' '1'   '2' '3' '4' sentinel-0

使用的转义序列都是八进制的:

'\0'  for character 0
'\012'  for character 10

答案 3 :(得分:1)

正如其他人所说,\0是一个转义字符,\012是一个转义字符。此外,C中的所有字符串都会自动附加\0

Array Index:  0   1   2   3   4   5   6   7   8   9
          x:  H   e   l   l   o  NUL NUL
          y:  H   e   l   l   o   1   2  NUL
          z:  H   e   l   l   o   LF NUL
          w:  H   e   l   l   o   1   2   3   4  NUL

NULLF是八进制0和八进制12 ASCII字符的名称。见:http://www.asciitable.com/