strlen函数原理

原理为while(*s++!=’\0’) cnt++;

首先需要了解一些基础知识:
1.数组内的存储形式为对应元素的ASCII码

2.\0代表无字符 ,注意无字符并不是数字0也不是空格
‘\0’ 单引号即代表了\0的ASCII码,而\0的ASCII码刚好为0
{
容易混淆的几个:
\0的ASCII码:0
空格的ASCII码:32
0的ASCII码:48
}

也就是说 也就是说strlen函数在遇到\0时就停止计数(即遇到ASCII码为0时),由于存储形式为ASCII码,0的ASCII码为48,所以遇到数字0时不停止计数。但是:如果我们使用了让字符变成数字的操作,这个时候就非常容易出现问题。比如 : 在100011中 , b[1]=0, 我们让 b[1] - ‘0’,让它可以表示数字。本来b[1]的存储形式为0的ASCII码,相减之后变为0,此时ASCII码被我们的操作变成了0,即无字符的状态,所以strlen函数在此停止,就会出现问题。

出现问题的代码:

#include<stdio.h>
#include<string.h>
int main(void)
{
    char ch[505];
   
    int sum=0;
    memset(ch,0,505);
    scanf("%s",ch);
                
    //int j=strlen(ch);
    for(int i=0,j=1;i<strlen(ch);i++,j++)
    {
            ch[i]-='0';
            sum+=ch[i];
            printf("%d strlen(ch)=%d\n",j,strlen(ch));
    }

    //printf("%d\n",sum);
    
    return 0;
}

相应的结果:
在这里插入图片描述
按照预期,循环应该在i>=strlen(ch)时结束,但是我们的操作使得strlen(ch)发生变化,所以循环提前结束,导致错误发生。解决方法一般为在循环外设置变量int j=strlen(ch);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值