【问题标题】:Octal representation inside a string in CC中字符串内的八进制表示
【发布时间】:2012-08-02 15:28:15
【问题描述】:

在给定的程序中:

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。

标签: c octal number-systems


【解决方案1】:
char *p = "\07777";

这里是一个字符串字面量,分配给一个指向字符的指针。

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

【讨论】:

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

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

八进制转义序列可以是字符常量或字符串文字的一部分,由 \ 后跟正好 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>。)

【讨论】:

    猜你喜欢
    • 2020-02-10
    • 2019-04-20
    • 2015-07-21
    • 1970-01-01
    • 2012-12-12
    • 2021-05-15
    • 2021-04-22
    • 2021-11-21
    • 1970-01-01
    相关资源
    最近更新 更多