在C语言中字符串里的八进制表示法

4
在给定的程序中:
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个或其他数量?
请解释其背后的逻辑。

我猜你真正的代码是 char *p = "\7777";,前面没有0。 - pmg
2个回答

5

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

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

"\07777"中,反斜杠后跟着3个八进制数字(0、7、7),它表示一个值为8进制077或10进制63的字符。在ASCII或ASCII衍生的编码中,它恰好对应问号'?'

因此,该字符串字面值代表长度为3的字符串,由'?','7'和'7'组成。

但你的问题中可能有打印错误。当我运行你的程序时,输出如下:

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

如果我将p的声明更改为:
char *p = "\0777";

我得到了你所描述的输出。请注意,最后一个----实际上是两个连字符,接着是一个空字符,然后是两个连字符。如果您在类Unix系统上,请尝试通过cat -vcat -A对程序的输出进行管道处理。
当您发布代码时,非常重要的是复制并粘贴它,而不是重新输入。
(并且您错过了顶部的#include <stdio.h>。)

5
char *p = "\07777";

这里将一个字符串字面量赋值给了一个 char 指针。

"\07777"

在这个字符串字面值中,使用了八进制转义序列,因此前三个数字表示一个八进制数。因为八进制转义序列的规则是——只能使用0到7之间的数字。八进制转义序列永远不会超过三个数字,并且以第一个不是八进制数字的字符结尾。虽然您不需要使用所有三个数字,但必须至少使用一个。例如,ASCII退格符的八进制表示为\10,字母A的八进制表示为\101,如ASCII表所示。
因此,您在内存中存储的字符串字面值如下:
第一个字节是一个八进制数077,即十进制数63和'?'字符
第二个和第三个字节分别为字符'7'和'7'
最后一个是终止字符'\0'
因此,您的答案是预期的字符串字面值的第一、第二和第三个字节。
要了解更多解释,请访问以下网站:http://msdn.microsoft.com/en-us/library/edsza5ck.aspx

这个链接会为你提供更多转义序列的相关信息:http://c0x.coding-guidelines.com/6.4.4.4.html。 - rajesh6115
那么你的问题是什么?只有你清楚地提出问题,才能得到一个好的回答。 - rajesh6115
更准确地说,八进制数应该在“\000”到“\377”的范围内,因为它将存储在1个字节中,在“\377”之后会显示警告:八进制转义序列超出范围。 - r.bhardwaj
是的,八进制转义序列最大可以到"\377",但如果您提供"\378",那么"\37"就是您的八进制数,而8则是字符(即最多提供3个字符,且所有字符都在0到7之间)。您对这个概念清楚吗? - rajesh6115

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接