在给定的程序中:
int main() {
char *p = "\0777";
printf("%d %d %d\n",p[0],p[1],p[2]);
printf("--%c-- --%c-- --%c--\n",p[0],p[1],p[2]);
return 0;
}
它将输出显示为:
63 55 0 -?-7-7
我可以理解,它正在将\0 (\077)之后的前两个字符从八进制转换为十进制,但谁能解释为什么是2个字符,为什么不是1或3个字符或其他字符呢?
请解释一下背后的逻辑。
发布于 2012-08-05 11:24:52
char *p = "\07777";
这里,分配给指向字符的指针的字符串文本。
"\07777"
在这个字符串中使用文字八进制转义序列,所以前三个数字表示一个八进制number.because规则,因为八进制转义序列是
在八进制转义序列中,只能使用0到7的数字。八进制转义序列不能超过三位数,并且以非八进制数字的第一个字符结束。虽然不需要使用所有三个数字,但必须至少使用一个数字。例如,ASCII背空间字符的八进制表示为\10,字母A为\101,如ASCII图表中所示。
因此,您的字符串文本存储在内存中,如
1字节作为八进制数077,在小数点和'?‘中只有63。在性格上
第2字节和第3字节分别作为字符'7‘和'7’
最后是一个终止字符\0。
因此,您的答案与预期的字符串文本的第1,2,3字节相同。
要获得更多的解释,您可以访问这个网站。
http://msdn.microsoft.com/en-us/library/edsza5ck.aspx
发布于 2012-08-05 09:18:59
这就是语言定义八进制转义序列的方式。
八进制转义序列可以是字符常量或字符串文字的一部分,它由一个\
和精确的1、2或3个八进制数字('0'
)组成。'7'
)。
在"\07777"
中,反斜杠后面跟着三个八进制数字(0,7,7),它表示一个字符,其值为077
,以八进制表示,63
以小数点表示。在ASCII或ASCII派生的编码中,这恰好是问号'?'
.
因此,文字表示一个长度为3的字符串,由'?'
、'7‘、'7’组成。
但你的问题肯定有错。当我运行您的程序时,我得到的输出是:
63 55 55
--?-- --7-- --7--
如果我将p
声明更改为
char *p = "\0777";
我得到了你描述的输出。注意,最后的----
实际上是两个连字符,后面是空字符,后面是两个连字符。如果您是在类似Unix的系统上,请尝试通过cat -v
或cat -A
传输程序的输出。
当您发布代码时,复制并粘贴它,而不是重新键入它是非常重要的。
(你错过了顶部的#include <stdio.h>
。)
https://stackoverflow.com/questions/11815076
复制相似问题