C中字符串内的八进制表示

时间:2012-08-05 08:43:32

标签: c octal number-systems

在给定的程序中:

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或任何其他?

请解释这背后的逻辑。

2 个答案:

答案 0 :(得分:4)

char *p = "\07777";

这里是一个分配给指向char的指针的字符串文字。

"\07777"

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

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

SO你的字符串文字存储在内存中,如

作为八进制数077的第一个字节,它只是十进制的63和'?'在角色

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

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

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

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

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

答案 1 :(得分:3)

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

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

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

因此,文字代表一个长度为3的字符串,由'?','7','7'组成。

但你的问题肯定会有拼写错误。当我运行你的程序时,我得到的输出是:

'?'

如果我将63 55 55 --?-- --7-- --7-- 的声明更改为

p

我得到你描述的输出。请注意,最后的char *p = "\0777"; 实际上是两个连字符,后跟一个空字符,后跟两个连字符。如果您使用的是类Unix系统,请尝试通过----cat -v来管理程序的输出。

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

(而且你错过了顶部的cat -A。)