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

r.b*_*waj 3 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;  
}
Run Code Online (Sandbox Code Playgroud)

它显示输出为:

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

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

请解释这背后的逻辑。

Kei*_*son 5

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

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

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

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

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

63 55 55
--?-- --7-- --7--
Run Code Online (Sandbox Code Playgroud)

如果我将声明更改p

char *p = "\0777";
Run Code Online (Sandbox Code Playgroud)

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

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

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


raj*_*115 5

char *p = "\07777";
Run Code Online (Sandbox Code Playgroud)

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

"\07777"
Run Code Online (Sandbox Code Playgroud)

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

您只能在八进制转义序列中使用数字 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