精华内容
下载资源
问答
  • C语言 获取数组长度的方法
    2021-01-18 22:20:58
    int get_array_length(int shuzu[]) 
    {
    	int length = 0;
    	while (*(shuzu + length) != -858993460)
    	{
    		length++;
    	}
    	printf("数组长度:%d\n", length);
    	return length;
    }

     

    更多相关内容
  • C语言求数组长度

    万次阅读 多人点赞 2020-10-10 21:11:57
    C语言对于不同的数据类型的数组求长度方式稍微有不同的地方: 1,对于字符数组求长度 第一种使用strlen() #include<stdio.h> #include<string.h> int main() { char a[10]="dmeo"; printf("%d",strlen...

    前言

    这是早期写的一篇文章,存在大量的错误,这里要做一个道歉,并对错误的内容做一些刊正

    首先要说明一下,求数组长度本身是一件不常见的事情,通常我们会根据自己的需求来申请数组的长度,同时系统也会一次性的给我们分配出数组要占据的全部内存

    但是某些时刻,我们申请的数组容量并不会被全部使用到,虽然我申请了长度为10的数组,但是我只存储5组的数据情况也时有发生,这个时候也许就有了得到数组真实长度的需求,但是很遗憾的是,大多情况下该问题是无解的,下面就做一些简单的解析

    对于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
    

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

    对于int数组

    如果从相同的角度思考,int数组初始化时直接赋值的结果是什么呢,同样写一段代码测试输出结果:

    void main()
    {
        int nums[4] = { 1,2 };
        for (int i = 0; i < 4; i++)
        {
            printf("%d ", nums[i]);
        }
    }
    //输出日志:1 2 0 0
    

    通过输出结果可以看出,直接对于数组初始化,系统会对未定义空间执行默认补充0的操作,而由于补0的这一操作,使得对于数据实际长度的判断收到干扰,以至于基本想不到什么办法可以排除补0的干扰而得到实际的数据长度,同样对于其他数字类型的数组也是如此

    这里我也同样测试了int数组的空数据的索引结果,在数据未初始化时候打印出的数值为:-858993460,这个数字刚好是变量未初始化时执行打印对应值(本身是二进制0xCCCCCCCC),这里如果你想的话,也可以通过该数做对比判断

    总结

    求数组真实长度本身意义不大,也基本没有应用空间,但是通过这一个过程,可以稍微来理解一下数组的结构与实现过程

    同时,目前我本人对于C语言的了解也不够深入,如果哪里描述有问题,还希望指出,我会认真理解并做出修改的

    展开全文
  • C语言数组长度的计算方法总结(sizeof与strlen)

    千次阅读 多人点赞 2021-07-27 11:50:36
    本文章详细介绍了C语言常见的定义数组的方式,并且详细讨论了strlen与sizeof求解数组的原理和使用情况。适合C语言的初学者阅读。

    最近在重新学习C语言,学习中发现之前对数组长度的计算方法模糊不清。因此做个总结。
    首先要明白什么是数组。
    数组是一组相同类型元素的集合。
    因此,要定义一个数组,首先要确定数组内的元素是同一种类型。

    1. 数组的创建

    首先来看看常用的数组的创建形式

    • int型
    	int arr1 [10] = {0};//定义了元素个数,且给第一个元素赋值为0,则其他元素均为0
    

    通过VS调试中的监视功能,可以看到各个数组的存放结果。

    在这里插入图片描述

    int arr2 [10] = {1, 2, 3, 4, 5};//定义了元素个数,但只给前五个元素赋值,则后五个元素均为0
    

    在这里插入图片描述

    int arr3 [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定义了元素个数,且给所有元素均赋值
    

    在这里插入图片描述

    int arr4 [10];//什么都不放,编译器会给数组的每个元素放置随机数。
    

    在这里插入图片描述

    int arr5[] = {1, 2, 3};//不定义元素个数,给几个元素赋值就有几个元素。
    

    在这里插入图片描述
    注意:
    如果你定义了数组的大小(也就是【】号里面写了数字),但是没有给任何元素赋值,那么这个数组的所有元素都默认为一个随机数!!!如果你定义了数组大小,但只给部分元素赋值,那么剩余元素的值默认为0!!!(见上面arr4和arr5)。

    因此常用上面arr1的方式,给int型数组的全部元素设置默认值为0.

    • char型
    	char arr6[] = "abc";//没有定义元素个数,用双引号定义3个字符,末尾数组会自动加上结束标志(\0)
    

    在这里插入图片描述

    char arr7 [10] = "abc";//定义10个元素个数,用双引号赋值三个字符串,其余7个元素均自动定义为\0
    

    在这里插入图片描述

    char arr8 [10] = {'a', 'b', 'c'};//定义10个元素个数,用大括号和单引号赋值三个字符串,则数组只含有三个字符,剩余7个均为\0
    

    在这里插入图片描述

    char arr9 [10] = {'a', 98, '98'};//char定义数组,元素中出现没有用单引号的数字,会根据ASCII码输出字符
    

    在这里插入图片描述

    	char arr10[] = {'a', 'b', 'c'};//没有定义元素个数,用大括号定义字符串,数组的元素个数则只有三个,结尾没有数组结束标志(\0)
    

    在这里插入图片描述
    注意:
    要格外注意举例中arr10和arr6的不同。同样为插入abc三个字符,但是arr6结尾有\0,arr10却没有,这在下一步求解数组长度的时候有相当大的区别!!!

    2. 求解数组的长度

    求解数组长度往往要用到两个函数,strlen或者sizeof

    • strlen求解数组长度

    strlen是用来求一个字符串(string)的长度,因此strlen不能用来求int类型的数组长度,只能求char类型的数字长度。
    具体代码如下:

    	char arr6[] = "abc";//没有定义元素个数,用双引号定义3个字符,末尾数组会自动加上结束标志(\0)
    	printf("length arr6 = %d\n", strlen(arr6));
    
    	char arr7 [10] = "abc";//定义10个元素个数,用双引号赋值三个字符串,其余7个元素均自动定义为\0
    	printf("length arr7 = %d\n", strlen(arr7));
    
    	char arr8 [10] = {'a', 'b', 'c'};//定义10个元素个数,用大括号和单引号赋值三个字符串,则数组只含有三个字符,剩余7个均为\0
    	printf("length arr8 = %d\n", strlen(arr8));
    
    	char arr9 [10] = {'a', 98, '98'};//char定义数组,元素中出现没有用单引号的数字,会根据ASCII码输出字符
    	printf("length arr9 = %d\n", strlen(arr9));
    
    	char arr10 [] = {'a', 'b', 'c'};//没有定义元素个数,用大括号定义字符串,数组的元素个数则只有三个,结尾没有数组结束标志(\0)
    	printf("length arr10 = %d\n", strlen(arr10));
    

    在这里插入图片描述
    注意:
    1、从arr6和arr7中可以看出,用双引号定义的字符串数组都能正确计算出数组长度。这是因为这两个数组的****末尾都含有结束标志”\0“(具体看前面举例中的截图)。

    2、另外要注意的是,arr10输入了三个字符,但结果却是15个,这是因为在没有定义数组个数的时候,用大括号的形式赋值,结尾不会自动补充结束标志\0,导致这个结果是个随机数,strlen会在内存中一直计数,知道在内存中遇到了0才会停止技术。
    但是对比arr8和arr9,也是用了大括号赋值,但结果却是正确的,这是因为开始定义了数组的个数,没有初始化赋值的数组会默认赋值为0(与\0有一样的效果)。

    3、如果用strlen用来求int类型数组的长度,会发现strlen不能用了。

    	int arr1 [10] = {0};//定义了元素个数,且给第一个元素赋值为0,则其他元素均为0
    	printf("length arr1 = %d\n", strlen(arr1));
    
    	int arr2 [10] = {1, 2, 3, 4, 5};//定义了元素个数,但只给前五个元素赋值,则后五个元素均为0
    	printf("length arr2 = %d\n", strlen(arr2));
    
    	int arr4 [10];//什么都不放,编译器会给数组的每个元素放置随机数。
    	printf("length arr4 = %d\n", strlen(arr4));
    

    在这里插入图片描述

    • sizeof求解数组长度

    sizeof能计算变量或者数据类型所占用的内存(以字节为单位)。用sizeof计算数组长度时,sizeof不关心数组内部存储的是什么类型的数据。
    所以常常用 sizeof(arr)/sizeof(arr[0]) 来计算数组的长度。其中“sizeof(arr)“计算了整个数组arr占据了多少内存(字节为单位),”sizeof(arr[0])“计算了数组中第一个元素所占多少字节,两者相除就是数组的长度。

    代码如下:

    	int arr1 [10] = {0};//定义了元素个数,且给第一个元素赋值为0,则其他元素均为0
    
    	int arr2 [10] = {1, 2, 3, 4, 5};//定义了元素个数,但只给前五个元素赋值,则后五个元素均为0
    
    	int arr3 [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定义了元素个数,且给所有元素均赋值
    
    	int arr4 [10];//什么都不放,编译器会给数组的每个元素放置随机数。
    	
    	int arr5[] = {1, 2, 3};//不定义元素个数,给几个元素赋值就有几个元素。
    
    	int len1 = sizeof(arr1) / sizeof(arr1 [0]);
    	int len2 = sizeof(arr2) / sizeof(arr2 [0]);
    	int len3 = sizeof(arr3) / sizeof(arr3 [0]);
    	int len4 = sizeof(arr4) / sizeof(arr4 [0]);
    	int len5 = sizeof(arr5) / sizeof(arr5 [0]);
    
    	printf("length arr1 = %d\n", len1);
    	printf("length arr2 = %d\n", len2);
    	printf("length arr3 = %d\n", len3);
    	printf("length arr4 = %d\n", len4);
    	printf("length arr5 = %d\n", len5);
    

    在这里插入图片描述
    可以看出,如果你一开始就定义了数组的大小,那么不管你插入多少个元素,求出来的结果永远是你定义的数组大小。
    如果你没有定义数组大小,那么算出来的就是你实际赋值的数组大小。

    	char arr6 [] = "abc";//没有定义元素个数,用双引号定义3个字符,末尾数组会自动加上结束标志(\0)
    
    	char arr7 [10] = "abc";//定义10个元素个数,用双引号赋值三个字符串,其余7个元素均自动定义为\0
    
    	char arr8 [10] = {'a', 'b', 'c'};//定义10个元素个数,用大括号和单引号赋值三个字符串,则数组只含有三个字符,剩余7个均为\0
    
    	char arr10 [] = {'a', 'b', 'c'};//没有定义元素个数,用大括号定义字符串,数组的元素个数则只有三个,结尾没有数组结束标志(\0)
    
    	int len6 = sizeof(arr6) / sizeof(arr6 [0]);
    	int len7 = sizeof(arr7) / sizeof(arr7 [0]);
    	int len8 = sizeof(arr8) / sizeof(arr8 [0]);
    	int len10 = sizeof(arr10) / sizeof(arr10 [0]);
    
    	printf("length arr6 = %d\n", len6);
    	printf("length arr7 = %d\n", len7);
    	printf("length arr8 = %d\n", len8);
    	printf("length arr10 = %d\n", len10);
    

    在这里插入图片描述
    注意:
    从arr6可以看出,当用sizeof求char类型数组的长度时,如果你没有定义数组长度,那么得出的结果会比实际大小大1。这是因为sizeof吧数组结尾的\0也算了进去。
    从arr7和arr8可以看出,如果定义了数组大小,跟int类型一样,不管怎么定义,定义了多少,结果都是你定义的那个数组大小。
    从arr10可以看出,如果你输入数组时用了大括号赋值,并且在结尾没有手动输入\0,那么算出的结果就是实际赋值的个数。

    总结:

    1. 定义数组时,要先明确数组的类型(int还是char或者其他类型)。
    2. sizeof不能用来计算已经定义好长度的数组的数组长度(如int arr[10] = {0},不能有中括号里的10)。
    3. strlen不能用来计算int类型的数组长度。
    4. int型计算数组长度,最好用 sizeof(arr) / sizeof(arr[0]) 来计算数组长度。
    5. char型数组如果要计算数组长度,一定要用双引号赋值。
    6. char型数组如果要用大括号赋值,一定要注意数组最后是否需要结束标志 \0
    展开全文
  • c语言求数组长度

    2019-07-06 00:06:47
    c语言求数组长度 退化为指针,不了 要把个数也传进来. 如果作为函数的参数是没法的, 但这样是可以的: #define LENGTH(s) (sizeof(s) / sizeof(int)) int s[12]; int length = LENGTH(s); sizeof(s) / sizeof...

    c语言求数组的长度

    退化为指针,求不了
    要把个数也传进来.

    如果作为函数的参数是没法求的,
    但这样是可以的:

    #define LENGTH(s) (sizeof(s) / sizeof(int))

    int s[12];
    int length = LENGTH(s);

    sizeof(s) / sizeof(int)就是数组s的元素个数呀, 动态的可以用指针呀

    展开全文
  • C语言数组长度的计算详解

    万次阅读 多人点赞 2020-05-23 18:23:01
    C语言数组长度的大小可以使用: int main() { int arr[] = {1,2,3,4,5}; int length = sizeof(arr)/sizeof(int); printf("the length of arr is %d\n", length); } 2) 在函数调用中计算数组的长度 上述计算数组...
  • c语言求数组长度

    万次阅读 2018-06-12 11:42:52
    1.在c语言数组的长度可用以下方法:char data[1024];...即可数组长度为10242.但是,如果是通过传递数组名参数到子函数中,上边的方法获取数组长度是不可行的例如:int myarrlen(char *data) {   int ...
  • C语言 数组长度函数

    2021-01-12 11:56:47
    http://topic.csdn.net/t/20051128/15/4423431.html 1.用宏是可以的这样写 #define ArraySize(ARR) (sizeof... 但是如果你传递的pI不是首指针的话就异常了 } 4.sizeof是编译器间静态值的。他必须知道对象的准确类型。
  • C语言获取数组长度

    万次阅读 多人点赞 2019-03-09 10:22:34
    1、c语言中,定义数组后可以用sizeof命令获得数组长度(可容纳元素个数)。 例如: double a[] = {1,2,3,4}; int length; length=sizeof(a)/sizeof(a[0]); //数组占内存总空间,除以单个元素占内存空间大小 printf...
  • C语言获取数组长度的几种方法

    千次阅读 2021-03-07 18:29:59
    如何通过编程的手段获取某个数组长度呢?答案是使用关键字 sizeof。前面说过,用 sizeof 可以获得数据类型或变量在内存中所占的字节数。同样,用 sizeof 也可以获得整个数组在内存中所占的字节数。因为数组中每个...
  • C语言求数组长度

    千次阅读 2018-04-02 10:53:30
    那么我们该如何一个未满的数组长度呢?下面给你一个方法:#include&lt;stdio.h&gt;int lengtha(int a[]){ int n=0; while(a[n]!='\0') n++; //'\0'=&gt;表示的是数组存放元素结束的标志  return ...
  • C语言计算数组长度

    千次阅读 2019-03-06 23:17:03
    字符串计算数组长度是strlen(),不要忘记#include&lt;string.h&gt; 和它不带最后一个null就没什么大问题。 sizeof()函数,用来计算()内的对象或者类型所占的内存字节数。用其来计算数组长度的方式很简单,...
  • C语言获得数组长度的函数

    万次阅读 多人点赞 2018-09-06 17:05:15
    1、c语言中,定义数组后可以用sizeof命令获得数组长度(可容纳元素个数)。 例如: double a[] = {1,2,3,4}; int length; length=sizeof(a)/sizeof(a[0]); //数组占内存总空间,除以单个元素占内存空间大小 ...
  • C语言实现数组长度计算方法

    千次阅读 2018-08-03 22:23:31
    写C时,经常要用到计算数组长度,我一般用下面这种方法: #define LEN(x) sizeof(x) / sizeof(x[0]) 即利用库函数sizeof来计算数组长度,这种方法,对一维数组和多维数组都有效,如以下代码示例: #include &...
  • C语言 求数组长度

    2015-10-24 15:42:25
    C语言 数组长度
  • c语言数组长度的计算

    千次阅读 2020-06-22 16:07:37
    c语言数组长度的计算 一维数组  计算数组的长度:       sizeof(数组名):得到这个数组占用内存的总长度       公式:        sizeof(数组名) / sizeof...
  • C语言求数组大小

    2021-07-25 21:59:38
    C语言求数组大小 莫问,问就是来水文章了???????? int main() { int len; int nums[3] = {2,2,1}; len = (int)(sizeof(nums) / sizeof(nums[0]));...数组长度为:3  请按任意键继续. . . ...
  • c语言获取数组长度的函数

    千次阅读 2020-10-09 18:23:33
    通过宏定义才能实现调取函数直接获取长度的效果,放到函数中不行。 具体原因请看:https://blog.csdn.net/qq_39516859/article/details/82464346 根据上文做出改进,代码: #include<stdio.h> #define ...
  • C语言数组长度能用变量指定吗?

    千次阅读 2021-04-22 22:31:11
    疑问:C语言数组长度就真不能用变量指定吗? 回答:不一定。 一、背景简介 C89/C90: C89即ANSI C,ANSI:美国国家标准学会(American Natinal Standards Institute) C90即ISO C,ISO:国际标准化组织...
  • C语言中计算数组长度的技巧

    多人点赞 2021-07-17 21:11:11
    C语言中计算数组长度的技巧
  • 展开全部1、c语言中,e5a48de588b63231313335323631343130323136353331333337613861定义数组后可以用sizeof命令获得数组长度(可容纳元素个数)。例如:intdata[4];intlength;length=sizeof(data)/sizeof(data[0]);/...
  • C语言数组长度!!

    千次阅读 2021-05-22 11:33:39
    C语言数组长度!!答案:4信息版本:手机版解决时间 2021-05-15 21:57已解决2021-05-15 08:18main(){char x[]=”STRING”;x[0」=0;x[1]=’\0’;x[2」=’0’;printf(”%d %d”,sizeof(x),...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 171,774
精华内容 68,709
关键字:

c语言求数组长度

友情链接: STM32F407LED闪烁.rar