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

3

別の方法として、 「1 の下限と読み取った文字数の上限を持つ」function Get_Line固定長を返すeither を使用します。Stringこの例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 に答える