我已经定义

subtype String10 is String(1..10);

并且我试图在不按回车键之前手动输入空格的情况下获得键盘输入。我尝试了get_line(),但是由于某种原因,它实际上不会等待输入,然后才输出get put()命令,而且我也认为它只会在字符串之前留下任何内容,而不会用空格填充它。

我知道并使用了Bounded_String和Unbounded_String,但是我想知道是否有一种方法可以使这项工作有效。

我试过做一个函数:
--getString10--
procedure getString10(s : string10) is
   c : character;
   k : integer;
begin
   for i in integer range 1..10 loop
      get(c);
      if Ada.Text_IO.End_Of_Line = false then
         s(i) := c;
      else
         k := i;
         exit;
      end if;
   end loop;

   for i in integer range k..10 loop
      s(i) := ' ';
   end loop;
end getString10;

但是,在这里,我知道s(i)不起作用,而且我认为
"if Ada.Text_IO.End_Of_Line = false then"

做了我希望它能做的事。在我寻找实际的方式时,它只是一个占位符。

我现在搜索了几个小时,但是Ada文档不如其他语言那么可用或清晰。我发现了很多有关获取字符串的信息,但不是我要找的东西。

最佳答案

只需在调用Get_Line之前用空格预初始化字符串即可。

这是我刚刚编写的一个小程序:

with Ada.Text_IO; use Ada.Text_IO;
procedure Foo is
    S: String(1 .. 10) := (others => ' ');
    Last: Integer;
begin
    Put("Enter S: ");
    Get_Line(S, Last);
    Put_Line("S = """ & S & """");
    Put_Line("Last = " & Integer'Image(Last));
end Foo;

以及我运行它时得到的输出:
Enter S: hello
S = "hello     "
Last =  5

除了预先初始化字符串之外,另一种可能性是在Get_Line调用之后将余数设置为空格:
with Ada.Text_IO; use Ada.Text_IO;
procedure Foo is
    S: String(1 .. 10);
    Last: Integer;
begin
    Put("Enter S: ");
    Get_Line(S, Last);
    S(Last+1 .. S'Last) := (others => ' ');
    Put_Line("S = """ & S & """");
    Put_Line("Last = " & Integer'Image(Last));
end Foo;

对于非常大的数组,后一种方法可能会更有效,因为它不会两次分配字符串的初始部分,但实际上差异不大。

10-07 16:44
查看更多