C语言中字符串内部的八进制表示法
在给定程序中:C语言中字符串内部的八进制表示法,c,octal,number-systems,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个或任何其他字符 请解
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个或任何其他字符
请解释这背后的逻辑。这只是语言定义八进制转义序列的方式 八进制转义序列可以是字符常量或字符串文字的一部分,它由一个
\
后跟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-v
或cat-a
管道传输程序的输出
当您发布代码时,复制并粘贴它是非常重要的,而不是重新键入它
(您缺少顶部的#include
)
这里是分配给指向字符的指针的字符串文字
"\07777"
在这个字符串中,使用了文字八进制转义序列,所以前三位数字代表一个八进制数---
在八进制转义序列中只能使用数字0到7八进制转义序列的长度不能超过三位,并且以非八进制数字的第一个字符结尾。虽然不需要全部使用三位数字,但必须至少使用一位。例如,ASCII退格字符的八进制表示为\10,字母A的八进制表示为\101,如ASCII图表中所示
所以字符串文本存储在内存中,如
第1字节为八进制数077,十进制为63,字符为“?”
第2和第3字节分别为字符“7”和“7”
和最后一个终止字符“\0”
所以你们的答案和预期的一样,是字符串文字的第1、第2、第3字节
有关更多说明,请访问此网站
我想你的真实代码有
char*p=“\7777”代码>前面没有0。此链接提供了有关转义序列的更多信息,那么您的问题是什么。如果您清楚地提到,那么您只能得到一个好的回答。更准确地说,八进制数应该在“\000”到“\377”之间,因为它将存储在1字节中,“\377”之后将显示警告:八进制转义序列超出范围。是,八进制转义序列的最大值可以是“\377”,但如果您提供“\378”,则“\37”是您的八进制数,8是字符(如果所有字符都在0到7之间,则最大值为3个字符)。您是否清楚这个概念?
"\07777"