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

Ada程序执行异常咨询:输入后无后续逻辑执行

Ada程序输入名字后无输出的问题分析与解决

嘿,我来帮你搞定这个问题!你的Ada程序编译没问题,但运行时输入名字后没任何输出,核心原因出在固定长度字符串的输入处理逻辑上,完全不需要额外安装工具,咱们调整代码就能解决。

问题根源

你定义的Name是固定长度50的字符串:STRING (1..50),当使用Get(Name)读取输入时,Ada会严格填满整个50字符的空间——比如你输入"Erick"(只有5个字符),剩下的45个位置会自动被空格填充。这时候你的判断条件Name = "Erick"其实是在比较"Erick"加上45个空格,和纯"Erick"当然不相等,所以所有分支都不会触发,自然没输出。

解决方案

推荐两种常见的修复方式,你可以根据需求选择:

方式一:使用动态字符串(更简洁)

用Ada标准库的Unbounded_String(动态长度字符串)配合Get_Line读取整行输入,完美匹配用户的实际输入:

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

procedure Main is
   Name : Unbounded_String;
begin
   Put("Hallo, what's your name? ");
   Flush; -- 确保提示语先显示,避免输出缓冲导致的延迟
   Name := Get_Line;
   if To_String(Name) = "William" then
      Put_Line ("Hai william");
   elsif To_String(Name) = "Erick" then
      Put_Line ("Hai erick");
   else
      Put_Line ("I don't know, who are you!");
   end if;
end Main;

方式二:保留固定长度字符串,调整输入处理

如果坚持用固定长度字符串,可以用Get_Line记录实际输入的长度,再截取有效部分并去掉多余空格:

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Strings.Fixed; use Ada.Strings.Fixed;

procedure Main is
   Name : STRING (1..50);
   Last : Natural; -- 记录输入的最后一个字符的索引
begin
   Put("Hallo, what's your name? ");
   Flush;
   Get_Line(Name, Last); -- 读取输入到Name,同时获取实际输入长度
   -- 截取有效部分并去掉右侧空格后再比较
   if Trim(Name(1..Last), Ada.Strings.Right) = "William" then
      Put_Line ("Hai william");
   elsif Trim(Name(1..Last), Ada.Strings.Right) = "Erick" then
      Put_Line ("Hai erick");
   else
      Put_Line ("I don't know, who are you!");
   end if;
end Main;

额外说明

  • 不需要安装任何额外工具,Gnat Studio和你用的在线编译器都完全支持这些标准库功能。
  • 加Flush是为了避免部分环境下输出缓冲导致的提示语不显示问题,确保用户能看到输入提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:46:08