C语言字符串反斜杠表示问题
在djbdns这个源码里看到以下的用法表示字符串,经研究\后面是8进制数,转换成16进制后正好符合协议定义,问题是这种表示法,编译器怎么知道\后面几位是数值、几位以后是普...
在djbdns这个源码里看到以下的用法表示字符串,经研究\后面是8进制数,转换成16进制后正好符合协议定义,问题是
这种表示法,编译器怎么知道\后面几位是数值、几位以后是普通字符?
比如char *s ="\0\377"; //8进制37等于0x1F,8进制377等于0xFF
那么表示①s[0]=0;s[1]=0xFF还是②s[0]=0;s[1]=0x1F;s[2]='7' ?
[code]#define DNS_C_IN "\0\1"
#define DNS_C_ANY "\0\377"
#define DNS_T_A "\0\1"
#define DNS_T_NS "\0\2"
#define DNS_T_CNAME "\0\5"
#define DNS_T_SOA "\0\6"
#define DNS_T_PTR "\0\14"
#define DNS_T_HINFO "\0\15"
#define DNS_T_MX "\0\17"
#define DNS_T_TXT "\0\20"
#define DNS_T_RP "\0\21"
#define DNS_T_SIG "\0\30"
#define DNS_T_KEY "\0\31"
#define DNS_T_AAAA "\0\34"
#define DNS_T_AXFR "\0\374"
#define DNS_T_ANY "\0\377"[/code]
这些宏在协议里实际是以下意思
A=0x01, //指定计算机 IP 地址。
NS=0x02, //指定用于命名区域的 DNS 名称服务器。
MD=0x03, //指定邮件接收站(此类型已经过时了,使用MX代替)
MF=0x04, //指定邮件中转站(此类型已经过时了,使用MX代替)
CNAME=0x05, //指定用于别名的规范名称。
SOA=0x06, //指定用于 DNS 区域的“起始授权机构”。
MB=0x07, //指定邮箱域名。
MG=0x08, //指定邮件组成员。
MR=0x09, //指定邮件重命名域名。
NULL=0x0A, //指定空的资源记录
WKS=0x0B, //描述已知服务。
PTR=0x0C, //如果查询是 IP 地址,则指定计算机名;否则指定指向其它信息的指针。
HINFO=0x0D, //指定计算机 CPU 以及操作系统类型。
MINFO=0x0E, //指定邮箱或邮件列表信息。
MX=0x0F, //指定邮件交换器。
TXT=0x10, //指定文本信息。
AAAA=0x1c,//IPV6资源记录。
UINFO=0x64, //指定用户信息。
UID=0x65, //指定用户标识符。
GID=0x66, //指定组名的组标识符。
ANY=0xFF //指定所有数据类型。 展开
这种表示法,编译器怎么知道\后面几位是数值、几位以后是普通字符?
比如char *s ="\0\377"; //8进制37等于0x1F,8进制377等于0xFF
那么表示①s[0]=0;s[1]=0xFF还是②s[0]=0;s[1]=0x1F;s[2]='7' ?
[code]#define DNS_C_IN "\0\1"
#define DNS_C_ANY "\0\377"
#define DNS_T_A "\0\1"
#define DNS_T_NS "\0\2"
#define DNS_T_CNAME "\0\5"
#define DNS_T_SOA "\0\6"
#define DNS_T_PTR "\0\14"
#define DNS_T_HINFO "\0\15"
#define DNS_T_MX "\0\17"
#define DNS_T_TXT "\0\20"
#define DNS_T_RP "\0\21"
#define DNS_T_SIG "\0\30"
#define DNS_T_KEY "\0\31"
#define DNS_T_AAAA "\0\34"
#define DNS_T_AXFR "\0\374"
#define DNS_T_ANY "\0\377"[/code]
这些宏在协议里实际是以下意思
A=0x01, //指定计算机 IP 地址。
NS=0x02, //指定用于命名区域的 DNS 名称服务器。
MD=0x03, //指定邮件接收站(此类型已经过时了,使用MX代替)
MF=0x04, //指定邮件中转站(此类型已经过时了,使用MX代替)
CNAME=0x05, //指定用于别名的规范名称。
SOA=0x06, //指定用于 DNS 区域的“起始授权机构”。
MB=0x07, //指定邮箱域名。
MG=0x08, //指定邮件组成员。
MR=0x09, //指定邮件重命名域名。
NULL=0x0A, //指定空的资源记录
WKS=0x0B, //描述已知服务。
PTR=0x0C, //如果查询是 IP 地址,则指定计算机名;否则指定指向其它信息的指针。
HINFO=0x0D, //指定计算机 CPU 以及操作系统类型。
MINFO=0x0E, //指定邮箱或邮件列表信息。
MX=0x0F, //指定邮件交换器。
TXT=0x10, //指定文本信息。
AAAA=0x1c,//IPV6资源记录。
UINFO=0x64, //指定用户信息。
UID=0x65, //指定用户标识符。
GID=0x66, //指定组名的组标识符。
ANY=0xFF //指定所有数据类型。 展开
4个回答
展开全部
"\"是转义符。
C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。
拥有转义字符的原因基本上是两点:
一、使用转义字符来表示字符集中定义的字符,比如ASCll里面的控制字符及回车换行等字符,这些字符都没有现成的文字代号。所以只能用转义字符来表示 。
二、某一些特定的字符在编辑语言中被定义为特殊用途的字符。这些字符由于被定义为特殊用途,它们失去了原有的意义。
扩展资料
八进制转义字符
八进制转义字符它是由反斜杠'/'和随后的1~3个八进制数字构成的字符序列。例如,'\60'、'\101'、'\141'分别表示字符'0'、'A'和'a'。
因为字符'0'、'A'和'a'的ASCII码的八进制值分别为60、101和141。字符集中的所有字符都可以用八进制转义字符表示。如果你愿意,可以在八进制数字前面加上一个0来表示八进制转移字符。
参考资料来源:百度百科—转义字符
展开全部
很简单,如果要在字符串中表示反斜杠,而不被编译器理解为转义字符,只需要使用两个反斜杠即可,即\\。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐于2017-10-12 · 知道合伙人教育行家
关注
展开全部
这个你看下C语言标准就可以了
字符串里的八进制表示一般是用3个数字,0-7有效,最多3个数字也可以1个或2个。如果发现后面跟的不是有效数字,那么提前停止解析。所以\078就解释为\07和字符8。
所以"\0\377",第一个字节是\0,第二个字节是\377也就是0xff,第三个字节是\0
字符串里的八进制表示一般是用3个数字,0-7有效,最多3个数字也可以1个或2个。如果发现后面跟的不是有效数字,那么提前停止解析。所以\078就解释为\07和字符8。
所以"\0\377",第一个字节是\0,第二个字节是\377也就是0xff,第三个字节是\0
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询