strlen(chars)是获得字符串chars的长度
T[i]=*(chars+i-1) 是将chars的第i-1个字符赋值给T[i]
strlen(chars)获取chars的长度
T[i]=*(chars+i-1)相当于T[i]=chars[i-1]
对于字符数组有专门的函数来处理这种情况,即strlen()
,其原理为遍历数组直到\0
为止,但是需要注意的是,其仅仅对于直接对于整个数组赋值时有效,如下代码所示,正常情况下可以直接打印出结果:
#include<stdio.h>
#include<string.h>
int main()
{
char a[10]="dmeo";
printf("%d",strlen(a)); //strlen()检索到\0结束
}
输出:
但是如果我们通过数组下标来执行一一赋值,就没有办法使用这样的方法了:
void main()
{
char a[10];
a[0] = 'c';
printf("%d", strlen(a));
}
//日志结果:54
这是因为我们直接为数组传入字符串demo
的时候,其实是传入一个demo\0
的字符串,并占据了五个数组位置,这里可以简单的验证,定义一个长度为4的字符数组并传入demo
这个字符串,系统会提示数组超限,如图:
由于字符串这样的特殊性,使得我们可以在char
数组中,根据\0
的位置来判断实际内容的长度
而回到第二种情况时,通过字符下标来传入数据时,并没有方法补充\0
,同时这种方式也并不是顺序插入数据,所以没有办法使用strlen()
函数来得到结果
那么还有什么办法可以使的吗,这里还是从现象出发,定义知乎数组,并打印一下,并对于未传入数据的部分执行打印:
void main()
{
char a[2];
a[0] = 'f';
for (int i = 0; i < 2; i++)
{
printf("%c ", a[i]);
}
}
输出结果:f ?
欸,没有插入数据的空间输出的是一个?
,但是真的是?
吗,可以加一个判断
void main()
{
char a[2];
a[0] = 'f';
for (int i = 0; i < 2; i++)
{
if (a[i] == '?')
{
printf("%s", "空的空间是?");
}
}
}
//打印日志:
其实空的空间输出结果并不是?
,只是由于乱码显示而出现的结果,当然我们可以直接将其转换为int
值来与ascii
码做对比,得到的结果与?
对应的并不相同,但是这给了我启发,如果每一个空的空间打印出的ascii
数值都一样,就可以用这个ascii
来执行判空操作,最后得到数组的真实长度
关于这个ascii数字,本身是系统在变量未初始化时,给定的一个值,其本身可能是随机的,但是可能由于DEBUG的原因,会给一个固定的值
首先通过打印得到空的ascii
数值为-52
,我也去百度了一下,发现有一些情况会出现-52
,稍微可以证明其相对是比较特殊的,有可能是系统补空的默认符号,简单的进行一些测试:
void main()
{
char a[10];
a[0] = 'f';
a[4] = 'g';
int length = 0;
for (int i = 0; i < 10; i++)
{
if ((int)a[i] != -52)
{
length++;
}
}
printf("%d", length);
}
//打印日志:2
我自己做了一些测试,发现结果都是对的,但是这一些都是根据现象做出的一些推测,并不能做出最后的肯定