字符串选择题专题

字符串的长度是指串中所含字符的个数
注意点1:
char test[]=”12345”;
上面test数组的长度是6!//因为还又一个’\0’放在这个数组最后。
但是test字符串的长度是5!

所以就会这样
char test[]=“12345”;
num=strlen(test);
printf(“sizeof=%d\n”,sizeof(test)/sizeof(test[0]));
printf(“strlen=%d”,num);
输出为:
sizeof=6
strlen=5

注意点2:

字符串中的\转义字符怎么办?(注意转义字符中的八进制,十六进制啥的和我们定义一个变量赋值它八进制和十六进制是有点差别的)

字符串FileStream 字符串"abcd\t\3"的长度_编译器


显然,\字符后面的一些东西,我们需要根据情况来看。

经过测试知道\后面加上数字,编译器的处理有以下规律:

1)\后紧跟的1-3个数字要是都是 <8的整数,那么我们就把1-3个数字看成一个八进制的整体。然后将它转换为十进制,然后就能找到这个ASCII码对应的字符。(注意\777这么大的八进制,也是可以的,虽然它转换为十进制后超出了我们的ASCII码表的范围,只是像这样的,我们就比较难知道那个八进制对应是什么字符)

测试代码:

问题\x和\x12和\X的区别

\后面接数字
总结1)
首先)编译器会检查是不是在八进制的范围内,要是在(0-7)的字符表示,那么就会将这个八进制识别(八进制
注意:编译器识别这个八进制,可以识别的是比如0-7,00-07,10-77,000-007,100-777(最后这个有点特殊)(也就是说,编译器不贪多,也不怕少,识别到0个八进制的,那我就把那一个看成十进制就好了,能识别1个是八进制的也好,2,3个也好,但是给我第4个位也可以理解为八进制的,我也不要)
因为八进制400对应的十进制是256了,比扩展的ASCII码都大1,产生了溢出。
对应这种溢出处理(其实也是编译器识别八进制的方法):
编译器先将八进制转换为二进制,取这些二进制后面8位。
不足8位,比如078对应的二进制是000 111那么就在高位补0,对应的二进制为00 000 111
超过8位,比如5578对应的二进制是101 101 111,取二进制低位的8个位,对应01 101 111(对应的十进制是55,对应字符7)
其次)要是发现,超出了八进制的范围,那就识别为十进制(十进制
显然,只有两种可能,那就是\8和\9
因为比如,\09,由于编译器,不贪多,它识别到0后面的是十进制,他就只给你指识别前面的\0为八进制,对应于十进制0(然后把字符串都结尾了),9就不小心被他给舍弃了。
\009也是一样的,只是是识别的是\00八进制,还是和\09有区别,但是不好意思,它对应的十进制还是0,历史总是惊人的相似,又舍弃了9

\后面接字母x或X (十六进制和其他)
\后面接着a,b…z或A,B…Z

十六进制的情况是:

小写的x才行,比如\xA和\xa是一样的,注意:在十六进制中大小写A-Z都是可以的!

大写的X不行,会显示警告:警告原因:编译器不认识‘\X’,然后编译器将\转义给舍弃了,不看它了?反正测试似乎是这样

字符串FileStream 字符串"abcd\t\3"的长度_编译器_02


字符串FileStream 字符串"abcd\t\3"的长度_字符串FileStream_03


字符串FileStream 字符串"abcd\t\3"的长度_十进制_04


所以,应该是的\被舍弃了,字符串变成了1234XA这个六个组成PS:

1)此外,x后面第一个只能跟16进制的,比如这样就肯定会报错

字符串FileStream 字符串"abcd\t\3"的长度_八进制_05


字符串FileStream 字符串"abcd\t\3"的长度_字符串FileStream_06


字符串FileStream 字符串"abcd\t\3"的长度_八进制_07


2)x后面跟着**1-n(过分,这比8进制过分多了,它就能作死的吃)**个应该是十六进制的,当然,碰到不是16进制的,编译器会和处理8进制一样,不贪多。但是如果,x后面紧接着的第一个就不是十六进制,这就不能忍了!比如还是上一条所说。

具体的一般情况:

字符串FileStream 字符串"abcd\t\3"的长度_编译器_08


字符串FileStream 字符串"abcd\t\3"的长度_编译器_09


显然,是和处理8进制一样的套路,我们大胆猜测1234\x00#的长度还是4(事实证明也是)

注意点:

字符串FileStream 字符串"abcd\t\3"的长度_十进制_10


字符串FileStream 字符串"abcd\t\3"的长度_编译器_11


字符串FileStream 字符串"abcd\t\3"的长度_八进制_12


一样的输出

字符串FileStream 字符串"abcd\t\3"的长度_字符串FileStream_13


还是一样的输出此外溢出也是:

字符串FileStream 字符串"abcd\t\3"的长度_编译器_14


字符串FileStream 字符串"abcd\t\3"的长度_十进制_15


字符串FileStream 字符串"abcd\t\3"的长度_编译器_16

这种情况的溢出处理,首先将十六进制转换为二进制,其中的低8位
不足8位,左边补二进制0,比如1234\x7G
它的十六进制是\x7表示的二进制是0111 编译器对它高位进行补0,最后是0000 0111
(十进制为7,对于字符(响铃),请仔细听)
超过8位,取低位的8位,比如1234\xFF53G
十六进制是\xFF53表示的二进制1111 1111 0101 0011,编译器取这个的低位的8位
也就是0101 0011(十进制对应的83,对应的字符S)