这段存储结构如何解读

img


这段存储结构如何实现,strlen(chars)的意义是什么,T[i]=*(chars+i-1)的含义是什么

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]

  • 这篇博客: C语言求数组长度中的 对于char数组使用用strlen() 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 对于字符数组有专门的函数来处理这种情况,即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
    

    我自己做了一些测试,发现结果都是对的,但是这一些都是根据现象做出的一些推测,并不能做出最后的肯定