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
相关产品推荐
相关产品推荐

