8

我已经定义

subtype String10 is String(1..10);

并且我正在尝试对其进行键盘输入,而无需在按 Enter 之前手动输入空格。我尝试了 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 文档不像其他语言那样可用或清晰。我发现了很多关于获取字符串的信息,但不是我想要的。

4

2 回答 2

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

另一种可能性,而不是预先初始化字符串,是在调用之后将余数设置为空格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;

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

于 2012-12-01T03:07:11.167 回答
3

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

附录:例如,这个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;
于 2012-12-01T02:18:31.163 回答