从一道笔试题中看转义字符

从一道笔试题中看转义字符

在这里插入图片描述

题目如下:

char s[] = "\\123456\123456\t";

printf("%d\n",strlen(s));

A 12 B 13 C 16 D 以上都不对
先不说结果如何,我们看看s[]在内存中的结构
在这里插入图片描述
很清楚,char[13]数组大小为13,答案似乎是B,很不幸错了,strlen返回的长度不包括结尾空白符,答案为A 12。

‘\’为转义符,转义字符用反斜杠\后面跟一个字符或一个八进制或十六进制数表示。
下图为转义字符表:
在这里插入图片描述
char s[] = “\123456\123456\t”;中的\相对于一个字符\,\123中,1,2,3都满足8进制数,因此\123其实表示一个字符。那么我现在看看为什么内存中显示char s[7] = ‘S’,即\123的值为‘S’??

\ddd 斜杠后面跟三位八进制数,该三位八进制数的值即为对应的八进制ASCII码值。八进制123换算成十进制 = 1* 8 * 8 + 2*8 + 3 = 83,由ASCII可以看出‘S’对于十进制83,八进制为123。

\x后面跟两位十六进制数,该两位十六进制数为对应字符的十六进制ASCII码值。

那么知道了上面的解答,下面一些情况看是怎么样的?

char s[] = "\123";  
//sizeof(s) = 2; strlen(s) = 1;ok

char s[] = "\192";  
//sizeof(s) = 4; strlen(s) = 3;因为9不是八进制数,所以\只对1起作用。ok?

char s[] = "\911";
 //sizeof(s) = 4; strlen(s) = 3;因为9不是八进制,所以\没有起到任何作用。ok?

char s[] = "\x12";  
//  sizeof(s) = 2; strlen(s) = 1;x后面有两位十六进制数,\x12其实是一个字符。ok?

char s[] = "\x111"
//这里编译器会报错:273对字符来说太大。
//这时编译器会傻傻的把\x
//后面所有的数字都看成十六进制的数 :1*16*16 + 1*16 + 1 = 273,
//ASCII表最多只有255个字符(下表不全,还有扩展的ASCII),所\x
//后面只能跟两个十六进制的数

这里有个小小的区别:\ddd 只计算后面3位八进制,而\x会把后面所有的位都计算!

char s[] = "\x011";

char s[] = "\x00011";
//这样不管前面有多少个0,strlen(s) 始终= 1。只要后面不连续出现3个大于0的数(当然编译器会编译报错)。

那么现在再来看看:

char s[] = "\\123456\0000123456\t";

sizeof(s) =;        
 // 编译器会把\000,3位八进制数字做转义,
 //即\000其实为一位,等于0,
 //这样长度为:1+6+1+1+6+1+1 = 17

strlen(s) =;        
 // 当遇到\0时,strlen函数会认为字符串到了结尾,
 //因此不再往下计算,所以strlen(s)只计算了“\\123456\0”这段长度,
 //去掉结尾空白符号,返回7

继续看个例子:

char s[] = "\\123456\0000123456\t\x0000aa";

sizeof(s) =; 
// '\\','1','2','3','4','5','6','\000',
//'1','2','3','4','5' ,'6','\t','\x0000aa','\0'
//返回18
strlen(s) =;       
//  '\\','1','2','3','4','5','6'
// 返回7

一些例题

1)

char string[]="ab\01";
printf("%d",strlen(string));

答案:3 (注意此处并非’\0’,而是/ddd的八进制数)

2)

char string[]="ab\012";
printf("%d",strlen(string));

答案:3

3)

char string[]="ab\0123";
printf("%d",strlen(string));

答案:4

4)

char string[]="ab\01a";
printf("%d",strlen(string));

答案:4

5)

char string[]="ab\0a1";
printf("%d",strlen(string));

答案:2,a>7 不在八进制内

上面程序测试中出现‘\0’,如果后面紧跟的是小于8的数字,那编译器就认为它是八进制数(\ddd 任意字符 三位八进制),算一个字符;如果紧跟的是字符,则’\0’表示空字符。这样,才会导致上述结果出现。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值