strlen()函数的那些细节

    字符串函数中有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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值