3

在给定的程序中:

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-- ----

我可以理解它将\0 (\077) 之后的前两个字符从八进制转换为十进制,但是任何人都可以解释为什么 2 个字符,为什么不是 1 或 3 或任何其他字符?

请解释这背后的逻辑。

4

2 回答 2

5
char *p = "\07777";

这里将字符串文字分配给指向 char 的指针。

"\07777"

在这个字符串中使用八进制转义序列,所以前三位数字代表一个八进制数。因为八进制转义序列的规则是——

您只能在八进制转义序列中使用数字 0 到 7。八进制转义序列永远不能长于三位数字,并且以不是八进制数字的第一个字符终止。尽管您不需要使用所有三位数字,但您必须至少使用一位。例如,ASCII 退格字符的八进制表示为 \10,字母 A 的表示为 \101,如 ASCII 图表中所示。

所以你的字符串文字存储在内存中,比如

第一个字节为八进制数 077,它只是十进制的 63 和“?” 性格上

第 2 和第 3 个字节分别为字符 '7' 和 '7'

最后一个终止字符'\0'。

所以你的答案是字符串文字的第 1、2、3d 个字节。

有关更多说明,您可以访问此网站

http://msdn.microsoft.com/en-us/library/edsza5ck.aspx

于 2012-08-05T11:24:52.053 回答
4

这只是语言定义八进制转义序列的方式。

八进制转义序列可以是字符常量或字符串文字的一部分,由 a\后跟 1、2 或 3 个八进制数字 ( '0'.. '7') 组成。

"\07777"中,反斜杠后跟 3 个八进制数字(0、7、7),表示一个字符,其值为077八进制或63十进制。在 ASCII 或 ASCII 派生编码中,这恰好是一个问号'?'

所以字面量表示一个长度为 3 的字符串,由'?', '7', '7' 组成。

但是你的问题一定有错别字。当我运行你的程序时,我得到的输出是:

63 55 55
--?-- --7-- --7--

如果我将声明更改p

char *p = "\0777";

我得到你描述的输出。请注意,最后----实际上是两个连字符,后跟一个空字符,然后是两个连字符。如果您使用的是类 Unix 系统,请尝试通过管道传输程序的输出cat -vcat -A

当您发布代码时,复制并粘贴它非常重要,而不是重新输入它。

(而且你错过#include <stdio.h>了顶部的。)

于 2012-08-05T09:18:59.490 回答