字符串函数中有strlen()这么个函数,我们度知道这个函数是用来求字符串长度的,但这只是最简单的说法,如果不深入了解这个函数,做题还是会出错,下面就来仔细剖析一下这个老熟人:
#include<stdio.h>
#include<string.h>
int main()
{
char a[] = "abcd";/*实际长度为5*/
char b[] = { 'a','b','c','d' };/*实际长度为4*/char c[] = "abcd\0";/*实际长度为6*/
char d[] = "abcd\0efg";/*实际长度为9*/
char e[] = "abcd\018\0";/*实际长度为8*/char f[] = "abcd\n";/*实际长度为6*/
char g[] = "abc\n\\\'\"";/*实际长度为8*/ /*一个\n,一个\\,一个\',一个\"*/char h[] = "abc\\0xy";/*实际长度为8*/
printf("%d\n", strlen(a));/*输出结果为4*/
printf("%d\n", strlen(c));/*输出结果为4*/
printf("%d\n", strlen(d));/*输出结果为4*/
printf("%d\n", strlen(e));/*输出结果为6*/
printf("%d\n", strlen(f));/*输出结果为5*/
printf("%d\n", strlen(g));/*输出结果为7*/
printf("%d\n", strlen(h));/*输出结果为7*/
return 0;
}
首先看数组a和数组b的区别,区别在于:字符串在被双引号包起来给字符数组初始化时,结尾多个\0。也就是说数组a的实际是“abcd\0”;数组b是利用单引号,也就是单个字符,就不会有这种情况,所以数组b实际是“abcd”。
但是!重点来了啊!strlen()函数在计算长度时是不计算\0这个字符的。所以说数组a的实际长度是5,但strlen()函数的输出结果是4;数组b的实际长度是4,strlen()函数的输出结果也是4。
再看数组c,d,e;这三个数组的共同之处在于都出现了\0;不同于数组a,数组a的\0是看不见的,是系统默认自动添加的,这三个数组里的\0是我们自己添加的,那么我们自己添加了后系统还要不要再添加一个\0呢?很多初学者都会有这样的疑惑,这里明确告诉大家,只要是双引号,系统不管你输入什么字符串都会在结尾自动添加一个\0。所以数组c实际是“abcd\0\0”;数组d实际是"abcd\0efg\0";数组e实际是"abcd\018\0\0"。再来看上面的第二句红字,所以数组c的实际长度是6,但strlen()函数的输出结果是4。注意!数组d和e是最容易出错的地,数组d的实际长度是9,但strlen()函数的输出结果是4,因为:如果\0后面不是数字,那么strlen()函数遇到\0就停止,且不计算\0。所以数组d只计算了"abcd"的长度,结果是4。再看数组e,如果\0后面是低于8的数字,那么那么strlen()函数遇到时算作一个八进制数。注意是低于8的数字,所以\01算一个,8单独算一个。如果\0后面是8或者比8大的数字,那么遇到\0就停。
再看数组f和数组g,这里都出现了除\0以外的其它转义字符,不同的是,strlen()函数在遇到除\0以外的其它转义字符时不会停止,算一个字符。
数组h比较特殊,很多人纠结\\0是拆成\\和0,还是拆成\和\0。很简单,strlen()函数从左往右,所以是拆成\\和0。