C语言 - strlen函数及int,char转换问题

题目

int main()
{
    int i;
    char a[1000];
    for(i = 0; i < 256; i++)
        a[i] = i + 1;
    printf("len = %d\n",strlen(a));
    printf("size = %d\n",sizeof(a));
    return 0;
}
输出结果:___ ___。

这题目咋一看没啥难度,答案是1000,1000!!!是,sizeof(a)为1000这应该是没什么争议,但如果你认为strlen(a)也是1000的话,那么你可能对strlen函数及C语言类型转换认识还不深刻,正确答案应该是255,为什么呢?下面我们进行分析。

代码分析

我们知道,在大多数编译器中,C语言的char类型占一个字节(Byte),取值范围是-128~127,而int类型则占4个字节。

从上面的代码我们可以看到定义的数组a是char型,i是int型,那么a[i] = i + 1就包含了将每次i+1的结果(int型)转换为char型,再存入数组。

因为char型的取值范围为-128~127,int型的范围要比char型大得多,所以a[0]到a[126]存放的即是1-127,到a[127]时,已经超出了char型能取值的范围,根据类型转换原理(数据占用字节扩充或者截断),我们可以知道a[127]是-128,验证一下:

int main()
{
    int i;
    char a[1000];
    for(i=0;i<256;i++)
    a[i] = i+1;
    printf("%d\n",strlen(a));
    printf("%d\n",a[126]);
    printf("%d\n",a[127]);
    printf("%d\n",a[128]);
    printf("%d\n",a[255]);
    return 0;
}

运行上述代码,结果如下所示:

微信截图_20191011160304.png

我们可以看到,确实a[127]为-128,而a[128]为-127,那么据此我们很清晰就可以知道,到a[255]时,其值应该为0。此时再根据strlen函数的原理:碰到数值0返回计数值(不包含0),所以答案255是怎么来的,分析到这里,相信大家应该都清楚了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值