原理为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);