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占内存的大小。
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;
}
3.2 指针减指针//coding 3 此方法用来计算char型数组的长度。详情见Example3.2(文章底部)
int my_strlen1( char *str)
{
char *p = str;
while(*p!='\0')
{
p++;
}
return p-str;
}
/* char型数组长度 */
int my_strlen1( char *str)
{
if(*str == NULL)
return 0;
else
return 1+my_strlen1(str+1);
}
细心的童鞋们不难发现,在第三步的过程中,我们分别使用了:“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数组与函数
注:此博客里所讲的数组全为一维数组,完整的代码都会相应的发布在文章底部。并且本文旨在解决问题,但是还有好多待优化的地方没写出来!比如:在往函数中传参时,可根据模板函数大大的较少代码量!如果有兴趣的童鞋们可以试着去做做看,如果有人想看,那我也可以在写一篇这样的教程!谢谢大家。
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数组与函数
相关文章推荐
- c语言 求解数组长度
- 【c语言】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字
- C语言中如何求任意一个int型数组的长度?
- Fortran和 C语言中数组的存储方式
- 约瑟夫环问题的两种解决方式(递归求解和数组模拟求解)
- c语言中数组长度的计算
- c语言怎么获取数组的长度
- C语言0长度数组(柔性数组)
- C语言中长度为0的数组 .
- C语言进阶-第6讲:递归法问题求解(递归求数组的最大值)
- 关于变长数组的一点小想法-C语言定义数组但是数组长度不确定怎么办
- c语言中长度为0的数组妙用
- 一维数组长度计算方式
- C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别
- C语言中多维数组的常见动态分配方式及其在函数参数传递时的应用
- C语言-字符串匹配-KMP算法及next数组求解和运用实例
- C语言 数组、字符串长度及所占内存
- Java 数组的不同定义方式和数组长度为可变参数
- C语言0长度数组(柔性数组)
- C语言 数组长度...int length = sizeof(stu) / sizeof(stu[0]);