\和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
请解释代码的输出。
答案 0 :(得分:8)
\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
NUL
和LF
是八进制0和八进制12 ASCII字符的名称。见:http://www.asciitable.com/