紧急运行时错误索引超出范围[3],长度为3

问题描述

遇到错误Panic Runtime Error索引超出范围[3],长度为3。以下错误似乎表明索引超出范围或长度

panic: runtime error: index out of range [3] with length 3
main.romanToInt(0xc000022080,0x3,0x8)
solution.go,line 15
main.__helper__(...)
solution.go,line 30
main.main()
solution.go,line 58
func romanToInt(s string) int {
    romanNum := map[byte]int{
        'I': 1,'V': 5,'X': 10,'L': 50,'C': 100,'D': 500,'M': 1000,}

    var sum int = 0
    for i := 0; i <= len(s); i++ {
        currentInt := romanNum[s[i]]
        nextInt := romanNum[s[i+1]]
        if currentInt < nextInt {
            sum = sum + (nextInt - currentInt)
            i += 1
        } else {
            sum = sum + currentInt
        }
    }
    return sum
}

指向错误

nextInt := romanNum[s[i+1]]

解决方法

对于i = len(s)-1,表达式s [i + 1]访问索引s [len(s)],该索引无效。您正在访问的索引不存在。即使您对其进行了修复,您的循环范围也会包含len,因此下次s [i]左右将超出范围。

,

让我们将字符串XII传递给函数。这使得len(s) 3,这意味着循环的主体(如果没有发生紧急情况)将执行 4 次(当i为{ {1}},012,因为您的情况是3

i <= len(s)i的迭代中(即,它是指2中的第二个I,最后一个字符),

XII

尝试访问下一个字符(nextInt := romanNum[s[i+1]] 将是i+1),然后它将超出范围。请记住,切片/数组是3索引的。这就是引起恐慌的原因。

如果0i时没有发生恐慌,那么肯定会在下一轮迭代中发生,其中2i,因为3在以下行中超出3的范围:

s

要解决此问题,您需要重新考虑如何处理循环情况。在此处使用currentInt := romanNum[s[i]] 可能会给您带来问题。另外,在循环体内,您需要考虑的是,当您查看字符串中的最后一个字符时,没有是下一个字符,但是您的代码只是假设存在。解决这两个问题应该可以帮助您克服这个问题。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...