从一道笔试题中看转义字符
来源:互联网 发布:nginx test config 编辑:程序博客网 时间:2024/05/21 18:42
题目如下:
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;okchar 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 = 17strlen(s) = ?; // 当遇到\0时,strlen函数会认为字符串到了结尾,因此不再往下计算,所以strlen(s)只计算了“\\123456\0”这段长度,去掉结尾空白符号,返回7
如果是:
char s[] = “\\123456\0000123456\t\x0000aa”;sizeof(s) = ?; strlen(s) = ?;
(以上程序都在win32,vs2010下测试,不知道到其它环境会不会有区别,如果有,烦请告知,谢谢)
ASCII字符表:
--------------------------------------------------------------------------------------------------------------------------2、
在VC6.0环境或者Linux GCC 下
char string[]="ab\01";printf("%d",strlen(string));
答案:3
char string[]="ab\012";printf("%d",strlen(string));
答案:3
char string[]="ab\0123";printf("%d",strlen(string));
答案:4
char string[]="ab\01a";printf("%d",strlen(string));
答案:4
char string[]="ab\0a1";printf("%d",strlen(string));
答案:2
char string[]="ab\0abc";printf("%d",strlen(string));
答案:2
上面程序测试中出现‘\0’,如果后面紧跟的是小于8的数字,那编译器就认为它是八进制数(\ddd 任意字符 三位八进制),算一个字符;如果紧跟的是字符,则'\0'表示空字符。这样,才会导致上述结果出现。
转自:http://www.cnblogs.com/cluster/archive/2011/06/01/2065987.html 有少许改动
0 0
- 从一道笔试题中看转义字符
- (笔记)从一道笔试题看字符型数据
- 一道关于字符查找的笔试题
- 从一道笔试题谈算法优化
- 《从一道笔试题谈算法优化》
- 从一道笔试题谈算法优化
- 从一道笔试题谈算法优化
- 从一道笔试题谈算法优化
- 从一道笔试题谈算法优化
- 从腾讯的一道笔试题说起
- 从一道笔试题谈算法优化
- 从一道笔试题理解const关键字
- 笔试题8:一些常见的转义字符
- 从一道笔试题谈算法优化(上)
- 从一道笔试题谈算法优化(下)
- 从一道笔试题谈算法优化(转)
- 从一道笔试题谈算法优化(下)
- 从一道笔试题来看指针的使用
- C++如何实现任意类型的数据交换
- Java技术——你真的了解String类的intern()方法吗
- ROS总结—— rqt_console 和 roslaunch
- Android复习日记-day 1
- js学习笔记归档梳理(1)
- 从一道笔试题中看转义字符
- AndroidManifest解析以及权限详解
- ubuntu下vi 上下左右 ABCD问题解决
- Third Maximum Number
- Percent Support Library使用详解
- DFS-危险系数(求图中割点数)
- 内存对齐的规则以及作用
- fzuacm 2017 新生寒假训练 7
- Qt qtablewidget 实现筛选功能,显示符合条件的整行信息