您的位置:首页 > 编程语言 > C语言/C++

C语言羁绊之数组长度的求解方式

2018-03-16 23:53 302 查看
    在c语言中,我们常常需要知道一个数组的长度,但是由于语言本身的特性,因此没有一个特别简单明了的方法能到达效果,因此,在这里写一些方法供大家参考!
       注:此博客里所讲的数组全为一维数组,完整的代码都会相应的发布在文章底部。并且本文旨在解决问题,但是还有好多待优化的地方没写出来!比如:在往函数中传参时,可根据模板函数大大的较少代码量!如果有兴趣的童鞋们可以试着去做做看,如果有人想看,那我也可以在写一篇这样的教程!谢谢大家。

1,通过自带的strlen()方法
      头文件   :    #include <string.h>         //别忘了,否则就不起作用了
      操作范围:    char类型的数组,对int数组不起作用
      局部示例:char arr[] = "asdfgh";
/* 如果此时arr数组是int型,则会报错,这是因为strlen()自身实现的限制 */
strlen(arr);

2,通过sizeof()方法
通过第一步我们发现使用,strlrn()方法的使用还是有许多局限性的,那我们第二种方法的效果如何呢?我们拭目以待。
原  理:通过strlen()函数我们可以获取一组元素的长度n,在通过同样的方法来获取一个元素的长度p,因此元素的总长度m=n/p。这就好比我们购物买同一种商品花了1000元,知道物品单价是100元,那么总共买了多少个物品呢?显而易见啊,1000/100 = 10(个)即是我们买的个数啊,这不就是一样的道理么!
简单代码片段:
/* 这是char型数组 */
char arr1[] = "asdfg";
int len1 = sizeof(arr1)/sizeof(arr1[0]);
/* 这是int型数组 */
int arr2[] = {1,2,3,4};
int len2 = sizeof(arr2)/sizeof(arr2[0]);
 所存在的问题:
通过传递数组名参数到子函数中,以获得数组长度是不可行的。因为传入的a只是一个指针,所以,sizeof(a)的结果是指针变量a占内存的大小。
int getLength(int[] a){
int length;
length=sizeof(a)/sizeof(a[0]); //这样是错误的,得到的结果永远是1
return length;
}

3,通过遍历数组来求数组长度
    前两种方法都是通过系统的函数来帮助我们求解出数组的长度,那么有没有一种方式我们可以自己定义函数来求解数组长度的,当然毫无疑问是可以实现的,并且实现的方式不是一种。下面我们来一起来探索吧!
      在c语言这种语言中,针对一个数组或字符串,判断其是否遍历完可以根据此时的值是否等于“NULL”、“0”、“/0”来判断,因此我们可以利用此性质来遍历数组(三种方式来遍历数组:即用计数器模拟、指针减指针、函数递归)哦!
3.1 计数器模拟
//coding 1 此方法用于判断字符串的长度,完整例子见Example3.1(文章底部)
int my_strlen1(char *str)
{
int count = 0;
while( *str != '\0')
{
str++;
count++;
}
return count;
}

//coding 2 此方法用于判断整型数组的长度,完整例子参考3.1(文章底部)
int my_strlen2(int *str)
{
int count = 0;
while( *str != '\0')
{
str++;
count++;
}
return count;
}
注:对于函数传数组参数不太熟悉的童鞋们可以去文章结尾参考4去查找哦。
3.2 指针减指针//coding 3 此方法用来计算char型数组的长度。详情见Example3.2(文章底部)
int my_strlen1( char *str)
{
char *p = str;
while(*p!='\0')
{
p++;
}
return p-str;
}
//coding 4 此方法用来计算int数组的长度,详情见Example3.2(文章底部)
int my_strlen2(int *str)
{
int *p = str;
while(*p!='\0')
{
p++;
}
return p-str;
}
3.3  使用递归来遍历 //coding 5 详情见Example3.3(文章底部)
    /* char型数组长度 */
int my_strlen1( char *str)
{
if(*str == NULL)
return 0;
else
return 1+my_strlen1(str+1);
}
//coding 6 详情见Example3.3(文章底部)
    /* 整型数组长度 */
int my_strlen2( int *str)
{
if(*str == NULL)
return 0;
else
return 1+my_strlen2(str+1);
}
4,总结
    细心的童鞋们不难发现,在第三步的过程中,我们分别使用了:“NULL”、“0”、“/0”来遍历一个数组,希望大家可以找到更好的办法。加油!未来已来,只是尚未流行

------------------------------------------------------

Example1(strlrn获取长度代码)
#include "stdio.h"
#include "string.h"
 /* 此方法只是简单的实现了char型字符串长度的输入 */
int main(){
char arr[] = "asdfg";
int n = strlen(arr);
printf("%d ",n);
return 0;
}

[b]Example2(sizeof方式获取长度代码)[/b]#include "stdio.h"
#include "string.h"
/* 请注意此时的sizeof实在main函数中调用的 */
int main(){
char arr1[] = "asdfg";
int len1 = sizeof(arr1)/sizeof(arr1[0]);
printf("%d ",len1);
int arr2[] = {1,2,3,4};
int len2 = sizeof(arr2)/sizeof(arr2[0]);
printf("%d ",len2);
return 0;
}[b]Example3.1(计数器模拟获取长度代码)[/b] #include <stdio.h>
/* char数组长度 */
int my_strlen1(char *str)
{
int count = 0;
while( *str != '\0')
{
str++;
count++;
}
return count;
}
/* int数组长度 */
int my_strlen2(int *str)
{
int count = 0;
while( *str != '\0')
{
str++;
count++;
}
return count;
}
int main()
{
int len1,len2;
cha
4000
r arr1[] = "abcdefgh";
int arr2[] = {1,2,3,4,5};
len1 = my_strlen1(arr1);
len2 = my_strlen2(arr2);
printf("%d\n",len1);
printf("%d\n",len2);
return 0;
    }
[b][b][b]Example3.2(指针减指针获取长度代码)[/b][/b][/b]#include<stdio.h>
/* char型数组长度 */
int my_strlen1( char *str)
{
char *p = str;
while(*p!='\0')
{
p++;
}
return p-str;
}
/* int型数组长度 */
int my_strlen2(int *str)
{
int *p = str;
while(*p!='\0')
{
p++;
}
return p-str;
}
int main()
{
int len1 = 0,len2 = 0;
char arr1[10]="abcdefgh";
int arr2[10]={1,2,3,4,5};
len1 = my_strlen1(arr1);
len2 = my_strlen2(arr2);
printf("%d\n",len1);
printf("%d\n",len2);
return 0;
} [b]Example3.3(递归获取长度代码)[/b] #include<stdio.h>
/* char型数组长度 */
int my_strlen1( char *str)
{
if(*str == NULL)
return 0;
else
return 1+my_strlen1(str+1);
}
/* 整型数组长度 */
int my_strlen2( int *str)
{
if(*str == NULL)
return 0;
else
return 1+my_strlen2(str+1);
}
int main()
{
int len1 = 0,len2 = 0;
char arr1[10]="abcdefgh";
int arr2[10]={1,2,3,4,5};
len1 = my_strlen1(arr1);
len2 = my_strlen2(arr2);
printf("%d\n",len1);
printf("%d\n",len2);
return 0;
}

参考:1,C语言中求数组长度

          2,C语言怎么获取数组的长度

          3,模拟实现strlen函数的三种方法

          4,C语言羁绊之int数组与函数


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息