Ada中输入不足5字符的字符串无法跳转至后续代码如何解决
问题原因
- 核心问题是你在
Get_Line执行后无判断调用了Skip_Line,触发了多余的输入等待:- 输入字符串长度≥5时,
Get_Line仅读取前5个字符,换行符仍留在输入缓冲区,此时Skip_Line刚好可以丢弃剩余行内容,运行符合预期。 - 输入字符串长度<5时,
Get_Line会读完所有输入字符并消耗掉末尾的换行符,此时调用Skip_Line会要求输入流再匹配到一个换行符,导致程序卡住等待额外输入。
- 输入字符串长度≥5时,
- 原代码还存在语法问题:变量
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
相关产品推荐
相关产品推荐

