数组与字符串长度 — C语言经典方法

本文介绍了C语言中求解数组和字符串长度的多种方法,包括静态数组和动态数组的长度计算,以及字符型数组的特殊处理。重点讨论了sizeof运算符、template模板、std::begin和std::end的使用,以及利用ASCII码和strlen库函数来确定字符串长度。
摘要由CSDN通过智能技术生成

阅读提示:文章比较冗长,若为了快速做题,请用常规方法sizeof和方法六计数器即可,其他对完成作业都没什么特别的意义,最后感谢您的点击与阅读~


数组与字符串

在C语言中,最精彩的地方果然还是属于数组与指针。所以写了一下在C/C++中,有关于求取数组与字符串长度的几种主流的方法。写得比较简略,若有疑问可以评论出来,若有不足欢迎指出,谢谢。

1 数组

静态数组:TYPE Array[NUM];
而动态数组:TYPE *Array = (TYPE *) malloc ( sizeof(TYPE) * NUM);

1.1 静态数组

对于任何数组而言,若长度已知,那么再写个求长度的函数是没有意义的,除非求有效长度,而非分配长度。比如,int array[N]这种形式。

而且,由于静态数组通常在预编译的时候就知道了数组长度,所以通常没必要在程序运行时再计算一遍长度,如int array[]

当然,这种知道是机器知道,而不是人知道。如果人希望知道这个数组的长度大小,那么这时使用在程序预编译阶段求值的运算符、模板等东西就特别合适,尽管它们会有些缺陷。

(1)sizeof 运算符

sizeof运算符可以返回一个变量或者类型所占的内存字节数。那么使用sizeof,分别获取数组内存和单个元素内存,其值之比就是数组长度。

  • sizeof - 常规方法
int array[] = {
   1,2,3,4,5,6,7,8,9}

int elementCount = sizeof (array) / sizeof (array[0]);

以下这几种写法是等价的:
1、整个数组所占字节数:sizeof(array) = sizeof(int[9])
2、单个元素所占字节数:sizeof(int) = sizeof(array[0]) = sizeof(array[9]) = sizeof(*array)
3、数组长度 = 整个数组所占字节数 / 单个元素所占字节数

不过,我们在C语言中习惯上在使用时都把它定义成一个宏:

  • sizeof - 宏定义表达式
/*方法一:在C语言中,sizeof的宏定义*/
#include<stdio.h>

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))

int main(void)
{
   
    int array[] = {
   1,2,3};
    
    printf("\nThe length of the array is %lu .\n", ARRAY_SIZE(array));
    
    return 0;
}
  • sizeof - 宏定义函数体
/*方法二:在C语言中,sizeof宏定义的另外一种写法*/
#include<stdio.h>

#define GET_ARRAY_LEN(arr, len) {len = (sizeof(arr) / sizeof(arr[0]));}

int main(void)
{
   
    int length = 0;
    int array[] = {
   1,2,3};
    
    GET_ARRAY_LEN(array, length);
    
    printf("\nThe length of the array is %d .\n", length);
    
    return 0;
}
  • sizeof - Linux内核源码

由于上面的宏并不完整,缺少了传参的类型判断容易被误用,比如用在指针而不是数组上。那么,在Linux内核源码分析里,增加了一个判断是否为数组的操作。

//以下方法均可运行,欢迎尝试

/*方法一的延伸:在Kennel中,ARRAY_SIZE宏的标准写法,增加了变量类型判断*/
#define  __same_type(a, b)    __builtin_types_compatible_p(typeof(a), typeof(b))
#define  BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
#define  __must_be_array(a)   BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
#define  ARRAY_SIZE(arr)      (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))


/*除此之外,还有另一种标准写法*/
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) \
						+ sizeof(typeof(int[1 - 2*!!__builtin_types_compatible_p(typeof(arr), typeof(&arr[0]))]))*0)


/*当然,如果上述方法太长,可以利用typeof来判断类型*/
#define ARRAY_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值