Ada.Strings.Fixed.Index循环调用返回不符合预期结果问题排查
问题根源
该问题是Ada字符串索引规则与GNAT.String_Split的切片实现共同导致的,和求值策略无关:
- Ada中的字符串本质是定长字符数组,数组的下标范围由其创建时的上下界决定,没有强制要求从1开始。
GNAT.String_Split拆分得到的每个子切片,会保留它在原始输入字符串中的原生下标范围:
你输入的原始字符串为"abcdSEPabcd",拆分出的第一个子串对应原始串的14位,下标范围为`1..4`;分隔符`SEP`占了原始串的57位,因此第二个子串对应原始串的8~11位,下标范围为8..11。Ada.Strings.Fixed.Index返回的是匹配结果在输入源字符串的原生下标,不是相对于子串首字符的偏移量,因此第二个子串的匹配结果返回8而不是1。
验证方式
你可以在循环内新增打印子串下界的代码验证该逻辑:
Put_Line("Substring lower bound: " & Integer'Image(Substring'First));
运行后会输出第一个子串下界为1,第二个子串下界为8。
修复方案
如果需要获取相对于子串首字符的偏移量,可采用以下两种方案:
- 手动计算相对偏移
Idx : Integer := Index(Substring, "abc") - Substring'First + 1;
- 将切片转为从1开始索引的标准字符串后再查询
declare -- 新定义的字符串会默认使用1起始的下标 Norm_Str : constant String := Substring; Idx : Integer := Index(Norm_Str, "abc"); begin -- 此时两次查询的Idx均为1 end;
内容的提问来源于stack exchange,提问作者oartart
相关产品推荐
相关产品推荐

