Ada语言如何实现按规则分割字符串取后半段(奇数长度含中间字符)
Ada字符串分割函数实现方案
核心计算逻辑
你需要的分割规则可以用统一公式计算起始下标,无需单独判断奇偶:分割起始位置 = 输入字符串的首个下标 + 字符串长度整除2
该公式对奇偶长度都适配:
- 长度为偶数时:比如长度8,8/2=4,取后4个字符,符合返回后半段的要求
- 长度为奇数时:比如长度5,5/2=2(整数除法自动截断小数部分),取后3个字符,刚好包含中间字符+后半段
现有代码问题修正
你当前代码存在3个可直接修复的问题:
- 函数内部使用的
Mid变量未提前声明,会直接触发编译错误 - 硬编码下标从1开始,不符合Ada字符串不定界的语法特性,传入非1开头的字符串会触发越界错误
- 主程序调用分割函数时没有截取
Get_Line返回的实际输入长度,会把输入内容后补的空格也纳入计算
完整可运行代码
with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; procedure Split is function Split_String (S : in String) return String is -- 用S'First适配任意起始下标的字符串,兼容所有合法String输入 Mid : constant Positive := S'First + (S'Length / 2); begin return S(Mid .. S'Last); end Split_String; S : String(1 .. 7); Input_Len : Integer; begin Put("请输入长度不超过7的字符串: "); Get_Line(S, Input_Len); -- 仅传入实际输入长度的子串,排除多余空格 Put_Line("分割结果: " & Split_String(S(1 .. Input_Len))); end Split;
测试验证
- 输入
test(长度4),返回st - 输入
stack(长度5),返回ack - 输入
candy(长度5),返回ndy - 输入
abcdefg(长度7),返回defg
如果需要适配示例中长度为8的Overflow输入,只需将主程序中S的定义修改为String(1 .. 8)即可。
内容的提问来源于stack exchange,提问作者leun
相关产品推荐
相关产品推荐

