由数组的下表得到长度

已知数组下表i和j(i < = j),问i到j的长度是多少(包括i和j)?

计算方法如下:

len = j - i + 1

 

例子:strFileName是一个包含后缀名,不包含路径的文件名(如:river.jpg),下面的代码能够得到它的后缀名:

 

 string strExtension;
 string::size_type posDot = strFileName.find_last_of('.');
 string::size_type len = strFileName.size() - posDot - 1; //如果套用上面公式的话,可以写成如下代码:
// string::size_type len = (strFileName.size() - 1) - (posDot + 1) + 1;
 strExtension = strFileName.substr(posDot + 1, len);

 

上面的代码中strFileName.size()其实就是字符串的 past-of-end 的下标。

<think>嗯,用户问的是如何在C++中通过接收到的数组指针来获取数组长度。这个问题看起来挺常见的,但里面可能有些陷阱。首先,我得回忆一下C++中数组和指针的关系。数组在传递给函数的时候会退化成指针,所以直接使用sizeof操作符可能无法得到正确的数组长度。 用户可能是在函数内部拿到一个数组指针,然后想知道这个数组有多少个元素。比如,如果有一个int* arr,如何确定它指向的数组长度?这时候我需要想到两种常见的情况:静态数组和动态分配的数组。 对于静态数组,比如在函数内部定义的int arr[5],使用sizeof(arr)/sizeof(arr[0])可以得到正确的元素个数,因为sizeof(arr)会返回整个数组的大小。但一旦数组作为参数传递给函数,比如void func(int arr[]),这时候arr实际上是一个指针,sizeof(arr)得到的是指针的大小,而不是数组的大小。所以这时候用户可能遇到了这个问题,他们传递数组给函数,但在函数内部无法正确获取长度。 如果是动态分配的数组,比如通过new int[n]或者malloc分配的,C++本身并没有记录数组长度,所以用户必须自己维护长度信息,无法通过指针直接获取。这时候需要用户手动传递长度参数,或者在类中封装数组长度,比如使用std::vector。 所以可能的解决方案包括:对于静态数组,在数组未退化为指针的地方(比如定义数组的作用域内)计算长度,并作为参数传递;或者使用模板函数在编译时推断数组长度。比如,模板函数template <typename T, size_t N> size_t array_size(T (&)[N]) { return N; },这样可以在传入数组时自动推导出长度。不过这种方法只适用于静态数组,且在函数模板中可以保留数组类型的信息。 另外,用户可能没有意识到标准库中的容器如std::vector或std::array已经自带size()方法,这些容器管理自己的大小,使用它们可以避免手动计算长度的麻烦。比如,使用std::vector<int> vec; vec.size()直接获取元素数量。 总结起来,用户需要明白在C++中,原生的数组在传递给函数时会丢失长度信息,因此必须通过其他方式传递长度,或者使用更高级的容器。如果用户确实需要处理原生数组,可以考虑模板方法或者维护一个额外的长度变量。此外,强调使用现代C++的容器类会更安全、更方便,避免手动管理带来的错误。</think>在C++中,通过数组指针直接获取数组长度存在挑战。以下是关键要点分步说明: $\boxed{\text{核心原理}}$ 数组指针本质上是$\text{内存地址}$,不包含长度信息。类型系统只能推导静态数组长度,无法处理动态内存。 $\boxed{\text{适用场景及解决方案}}$ 1. $\textcolor{blue}{\text{静态数组(编译期已知长度)}}$ ```cpp int arr[5] = {1,2,3,4,5}; size_t len = sizeof(arr)/sizeof(arr[0]); // ✅ 正确得到5 ``` $\boxed{\text{限制}}$:仅适用于原始定义作用域内未退化的数组 2. $\textcolor{red}{\text{指针参数(常见错误场景)}}$ ```cpp void func(int* arr) { // ❌ sizeof(arr) 返回指针大小(通常4/8字节) size_t wrong_len = sizeof(arr)/sizeof(arr[0]); } ``` 3. $\textcolor{green}{\text{模板推导(高级技巧)}}$ ```cpp template <typename T, size_t N> size_t getArraySize(T (&)[N]) { // ✅ 保持数组类型不退化 return N; } int main() { int arr[5]; cout << getArraySize(arr); // 输出5 } ``` 4. $\textcolor{purple}{\text{动态分配内存}}$ ```cpp int* ptr = new int[5]; // ❌ 无标准方法获取长度,必须手动记录 ``` $\boxed{\text{最佳实践}}$ - 优先使用$\text{std::vector}$或$\text{std::array}$ ```cpp std::vector<int> vec{1,2,3}; cout << vec.size(); // ✅ 输出3 std::array<int,5> arr; cout << arr.size(); // ✅ 输出5 ``` - 必须使用原生数组时,始终$\text{显式传递长度参数}$ ```cpp void processArray(int* arr, size_t length) { // 安全操作 } ``` $\boxed{\text{为什么需要这样设计?}}$ C++遵循"$\text{不为不需要的功能买单}$"原则: - 存储长度会增加内存开销 - 指针运算需要保持与C语言的兼容性 $\boxed{\text{总结流程图}$ 原始数组 → 传递指针 → 长度信息丢失 ↑解决方案↓ 1. 模板推导(静态数组) 2. 容器类(动态数组) 3. 手动传递长度参数(通用方案)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值