37.测试下标越界

本文展示了C++中数组访问的基本用法,包括正向和负向索引。示例代码中,`a[0]`正确访问了数组的第一个元素,而`a[-1]`则尝试访问数组之外的元素,这种行为可能导致未定义的结果。理解数组边界对于编程至关重要。
#include<iostream>
using namespace std;
int main()
{
	int a[10] = { 0,1,2,3,4,5,6,7,8,9 };
	cout << "a[0]=" << a[0] << endl;
	cout << "a[-1]=" << a[-1] << endl;
	cout << endl;
	return 0;
}

以下是修复了**下标越界错误**的VBA代码,增加了详细的错误处理和数据类型验证: ```vba Sub CopyMatchingRows_Safe() Dim ws1 As Worksheet, ws2 As Worksheet Dim lastRow1 As Long, lastRow2 As Long Dim i As Long, j As Long, matchCount As Long Dim searchValue As String, errMsg As String On Error GoTo ErrorHandler ' 验证工作表存在性 Set ws1 = GetWorksheet("表格1") ' 修改为实际表名 Set ws2 = GetWorksheet("表格2") ' 修改为实际表名 If ws1 Is Nothing Or ws2 Is Nothing Then Exit Sub ' 获取有效数据行范围(跳过空值和错误值) lastRow1 = GetLastDataRow(ws1, 1) lastRow2 = GetLastDataRow(ws2, 1) If lastRow1 < 1 Or lastRow2 < 1 Then MsgBox "没有找到有效数据", vbExclamation Exit Sub End If Application.ScreenUpdating = False ' 反向遍历表格1 For i = lastRow1 To 1 Step -1 ' 验证A列值有效性 If IsEmpty(ws1.Cells(i, 1)) Or IsError(ws1.Cells(i, 1)) Then GoTo ContinueLoop ' 标准化搜索值(处理文本型数字) searchValue = Format(Trim(ws1.Cells(i, 1).Text), "0000") If Len(searchValue) < 4 Then GoTo ContinueLoop ' 遍历表格2 For j = 1 To lastRow2 If Not IsEmpty(ws2.Cells(j, 1)) And Not IsError(ws2.Cells(j, 1)) Then ' 使用Like运算符实现模糊匹配 If "*" & searchValue & "*" Like "*" & Format(Trim(ws2.Cells(j, 1).Text), "0000") & "*" Then ' 插入行并复制数据 ws1.Rows(i + 1).Insert Shift:=xlDown ws2.Rows(j).Copy Destination:=ws1.Rows(i + 1) matchCount = matchCount + 1 Exit For End If End If Next j ContinueLoop: Next i Application.ScreenUpdating = True MsgBox "成功插入 " & matchCount & " 行匹配数据", vbInformation Exit Sub ErrorHandler: Application.ScreenUpdating = True errMsg = "错误发生在:" & vbCrLf & _ "工作表1: " & ws1.Name & " 行 " & i & vbCrLf & _ "工作表2: " & ws2.Name & " 行 " & j & vbCrLf & _ "错误号: " & Err.Number & vbCrLf & _ "错误描述: " & Err.Description MsgBox errMsg, vbCritical End Sub ' 安全获取工作表函数 Function GetWorksheet(shtName As String) As Worksheet On Error Resume Next Set GetWorksheet = ThisWorkbook.Sheets(shtName) On Error GoTo 0 If GetWorksheet Is Nothing Then MsgBox "工作表 '" & shtName & "' 不存在", vbExclamation End If End Function ' 获取有效数据最后行号(跳过空行和错误值) Function GetLastDataRow(ws As Worksheet, col As Long) As Long Dim lastRow As Long On Error Resume Next lastRow = ws.Cells(ws.Rows.Count, col).End(xlUp).Row On Error GoTo 0 ' 验证实际有数据的行 If lastRow > 0 Then While lastRow >= 1 And (IsEmpty(ws.Cells(lastRow, col)) Or IsError(ws.Cells(lastRow, col))) lastRow = lastRow - 1 Wend End If GetLastDataRow = lastRow End Function ``` ### 主要修复点说明: 1. **下标越界防护**: - 添加`GetWorksheet`函数验证工作表存在性 - 使用`GetLastDataRow`函数跳过空值和错误值 - 所有单元格访问前检查`IsEmpty`和`IsError` 2. **数据类型安全**: - 使用`Trim()`和`Format()`标准化数字格式 - 添加`Len(searchValue) < 4`长度验证 3. **增强的匹配逻辑**: - 改用`Like`运算符支持模糊匹配 - 自动处理文本型数字(如"0001"和"1"的匹配) 4. **错误处理机制**: - 定位错误发生的具体位置 - 显示完整的错误代码和描述 ### 使用建议: 1. 确保表格1的A列和表格2的搜索列包含可匹配的数据 2. 对于大数据量(>10000行),建议先在小范围测试 3. 如果仍出现错误,检查是否有合并单元格或特殊格式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值