You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ada中输入不足5字符的字符串无法跳转至后续代码如何解决

问题原因
  • 核心问题是你在Get_Line执行后无判断调用了Skip_Line,触发了多余的输入等待:
    • 输入字符串长度≥5时,Get_Line仅读取前5个字符,换行符仍留在输入缓冲区,此时Skip_Line刚好可以丢弃剩余行内容,运行符合预期。
    • 输入字符串长度<5时,Get_Line会读完所有输入字符并消耗掉末尾的换行符,此时调用Skip_Line会要求输入流再匹配到一个换行符,导致程序卡住等待额外输入。
  • 原代码还存在语法问题:变量I未声明、F: Float末尾缺分号、引用了未使用的Ada.Float_Text_IO包。
修正后代码
with Ada.Text_IO;              use Ada.Text_IO;

procedure Help is
    S : String(1..5);
    I : Natural;
begin
    -- 第一次输入
    Put("Type a string with max 5 characters: ");
    Get_Line(S, I);
    -- 仅当输入长度等于缓冲区长度时,才需要跳过剩余行内容
    if I = S'Length then
        Skip_Line;
    end if;
    Put("You typed the string: ");
    Put(S(1..I));
    New_Line;
    New_Line;

    -- 第二次输入
    Put("Type a string with max 5 characters: ");
    Get_Line(S, I);
    if I = S'Length then
        Skip_Line;
    end if;
    Put("You typed the string: ");
    Put(S(1..I));
end Help;
逻辑说明
  • 缓冲区S直接定义为长度5,无需额外留冗余位
  • 每次Get_Line执行后判断读取长度I:如果I等于缓冲区长度,说明输入行超长,调用Skip_Line丢弃剩余的行内容;否则说明已经读完一整行,无需额外操作
  • 完全匹配需求:回车即代表当前输入结束,长度不足5不会要求补全,长度超过5自动截取前5位。

可选更稳妥方案

如果不想处理Skip_Line的判断逻辑,可以用无界字符串先读取完整输入行再截取,彻底避免输入残留问题:

with Ada.Text_IO;              use Ada.Text_IO;
with Ada.Strings.Unbounded;    use Ada.Strings.Unbounded;

procedure Help is
    Input_Line : Unbounded_String;
    Len : Natural;
begin
    Put("Type a string with max 5 characters: ");
    Input_Line := To_Unbounded_String(Get_Line);
    Len := Natural'Min(Length(Input_Line), 5);
    Put("You typed the string: ");
    Put(Slice(Input_Line, 1, Len));
    New_Line;
end Help;

内容的提问来源于stack exchange,提问作者leun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 08:30:00