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

Ada程序读取键盘输入时无法识别End_of_Line问题求助

解决Ada程序无法识别End_of_Line的问题

问题分析

你的代码存在两个核心问题:

  • 语法错误:循环内部的then exit; end if;没有对应的if条件,会直接导致编译失败。
  • 输入读取逻辑偏差:Get_Immediate是直接读取单个键盘字符,不依赖行缓冲机制;而End_Of_Line是检查输入流是否处于行尾位置。Windows系统下回车会输入\r\n两个字符,Get_Immediate只会逐个读取,不会触发End_Of_Line的状态判断,导致循环无法终止。

解决方案

方案1:修复手动读取逻辑,适配Windows换行符

如果坚持用逐个字符读取的方式,需要手动检查读取到的字符是否为换行符(ASCII.LF)或回车符(ASCII.CR),并处理Windows的CRLF组合:

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Characters.Latin_1; use Ada.Characters.Latin_1;

function Read_str return String is
   In_String : String (1 .. 100);
   Nr        : Integer := 1;
   C         : Character;
begin
   Put_Line ("Start Read_str");
   loop
      exit when Nr > 100; -- 防止数组越界
      Get_Immediate(C);
      if C = LF then
         exit; -- 遇到换行符终止循环
      elsif C /= CR then -- 跳过Windows下的回车符\r
         In_String(Nr) := C;
         Nr := Nr + 1;
      end if;
      -- 调试输出
      Put_Line("Invoer = " & Integer'Image(Nr-1));
      if Nr-1 >=6 then
         Put_Line("String = " & In_String(6 .. Nr-1));
      end if;
   end loop;
   return In_String(1 .. Nr-1); -- 返回实际读取的有效字符部分
end Read_str;

方案2:使用Get_Line简化读取逻辑

Ada.Text_IO.Get_Line是专门读取一行字符串的标准方法,会自动处理行终止符(包括Windows的CRLF),无需手动循环:

with Ada.Text_IO; use Ada.Text_IO;

function Read_str return String is
   Max_Length : constant := 100;
   In_String : String (1 .. Max_Length);
   Last      : Integer;
begin
   Put_Line ("Start Read_str");
   Get_Line(In_String, Last); -- 读取一行,Last记录实际读取的最后一个字符索引
   -- 调试输出
   Put_Line("实际读取字符数 = " & Integer'Image(Last));
   if Last >=6 then
      Put_Line("String = " & In_String(6 .. Last));
   end if;
   return In_String(1 .. Last); -- 返回有效部分
end Read_str;

关键说明

  • Get_Line会自动跳过行尾的终止符(无论是LF还是CRLF),并通过Last参数返回实际读取的字符长度,避免数组越界问题。
  • 只有当需要保留换行符等特殊场景时,才需要用Get_Immediate手动处理,常规读取一行字符串用Get_Line更高效且不易出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 10:22:15