Ada:获取用户对String(1..10)的输入并用空格填充其余部分

时间:2012-12-01 01:39:39

标签: string input ada

我已经定义了

subtype String10 is String(1..10);

并且我试图获得键盘输入,而不必在输入之前手动输入空格。我尝试了get_line()但是由于某种原因它在输出get put()命令之前实际上不会等待输入,而且我也认为它会在那之前留下字符串中的内容并且不用空格填充它。 / p>

我知道并使用过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文档不像其他语言那样可用或清晰。我找到了很多关于获取字符串的内容,但不是我正在寻找的内容。

2 个答案:

答案 0 :(得分:7)

在调用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

另一种可能性,而不是预先初始化字符串,是在<{em> 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;

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

答案 1 :(得分:3)

作为替代方法,使用function Get_Line,它返回一个固定长度String,其“下限为1,读取的字符数上限”。示例Line_By_Line使用从文件中读取的变体。如果需要,您可以使用procedure MoveSource字符串复制到Target字符串;默认情况下,该过程会自动填充空格。

附录:例如,这Line_Test张贴*并默默截断右边的长行。

with Ada.Integer_Text_IO;
with Ada.Strings.Fixed;
with Ada.Text_IO;

procedure Line_Test is
   Line_Count : Natural := 0;
   Buffer: String(1 .. 10);
begin
   while not Ada.Text_IO.End_Of_File loop
      declare
         Line : String := Ada.Text_IO.Get_Line;
      begin
         Line_Count := Line_Count + 1;
         Ada.Integer_Text_IO.Put(Line_Count, 0);
         Ada.Text_IO.Put_Line(": " & Line);
         Ada.Strings.Fixed.Move(
            Source  => Line,
            Target  => Buffer,
            Drop    => Ada.Strings.Right,
            Justify => Ada.Strings.Left,
            Pad     => '*');
         Ada.Integer_Text_IO.Put(Line_Count, 0);
         Ada.Text_IO.Put_Line(": " & Buffer);
      end;
   end loop;
end Line_Test;