2012-12-01 23 views
6

tôi đã xác địnhAda: Bắt đầu vào sử dụng vào một String (1..10) và điền vào phần còn lại với khoảng trắng

subtype String10 is String(1..10); 

và tôi đang cố gắng để có được đầu vào bàn phím để nó mà không cần phải tự nhập khoảng trắng trước nhấn enter. Tôi đã thử get_line() nhưng từ một số lý do nó sẽ không thực sự chờ đợi cho đầu vào trước khi outputting lệnh get put(), và tôi cũng nghĩ rằng nó sẽ chỉ để lại bất cứ điều gì trong chuỗi trước đó và không điền nó với không gian màu trắng.

Tôi biết và đã sử dụng Bounded_String và Unbounded_String, nhưng tôi tự hỏi liệu có cách nào để thực hiện công việc này không.

tôi đã cố gắng thực hiện một chức năng cho nó:

--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; 

nhưng, ở đây, tôi biết s(i) không làm việc, và tôi không nghĩ rằng

"if Ada.Text_IO.End_Of_Line = false then" 

làm những gì Tôi hy vọng nó sẽ làm một trong hai. Đó là kinda chỉ là một giữ chỗ trong khi tôi tìm cách thực tế để làm điều đó.

Tôi đã tìm kiếm một vài giờ ngay bây giờ, nhưng tài liệu Ada không có sẵn hoặc rõ ràng như các ngôn ngữ khác. Tôi đã tìm thấy rất nhiều về việc nhận được chuỗi, nhưng không phải những gì tôi đang tìm kiếm.

+1

So sánh bình đẳng với 'true' và' false' không rõ ràng. Thay vì 'nếu Ada.Text_IO.End_Of_Line = false thì', chỉ cần viết' nếu không Ada.Text_IO.End_Of_Line rồi'. (Mặc dù tôi không nghĩ rằng bạn cần phải sử dụng 'End_Of_Line' anyway.) –

Trả lời

6

Chỉ cần khởi tạo chuỗi trước khi gọi Get_Line.

Dưới đây là một chương trình nhỏ, tôi chỉ ném với nhau:

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; 

và đầu ra tôi nhận được khi tôi chạy nó:

Enter S: hello 
S = "hello  " 
Last = 5 

Một khả năng khác, chứ không phải là tiền khởi tạo chuỗi, là để đặt số còn lại cho khoảng trắng sau số Get_Line gọi:

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; 

Đối với các mảng rất lớn, cách tiếp cận thứ hai có thể hiệu quả hơn vì nó không gán phần ban đầu của chuỗi hai lần, nhưng trong thực tế sự khác biệt là không đáng kể.

+0

Cảm ơn. Tôi không chắc tại sao tôi không nghĩ đến việc khởi tạo trước nó. Liệu "(những người khác =>") "chỉ cần điền vào S với không gian? Tôi đã chỉ sử dụng nó trong trường hợp cấu trúc cho đến nay, vì vậy tôi không chắc chắn những gì khác nó. – user1279914

+2

+1 để thực sự giải quyết câu hỏi. :-) @ user1279914: Xem thêm [* 4.3.3 Array Aggregates *] (http://www.adaic.org/resources/add_content/standards/05rm/html/RM-4-3-3.html). – trashgod

+1

Có, mệnh đề 'else' trong một mảng tổng hợp đề cập đến tất cả các phần tử không được chỉ định khác. Nếu có * chỉ * một mệnh đề 'else', nó đề cập đến tất cả các phần tử của mảng. –

2

Cách khác, sử dụng function Get_Line, trả về độ dài cố định String rằng "có giới hạn dưới 1 và giới hạn trên của số ký tự đã đọc". Ví dụ Line_By_Line sử dụng biến thể đọc từ tệp. Nếu cần, bạn có thể sử dụng procedure Move để sao chép chuỗi Source thành chuỗi Target; các thủ tục tự động miếng đệm với không gian theo mặc định.

Hợp đồng bổ sung: Ví dụ: Line_Test miếng đệm này với * và âm thầm cắt ngắn các dòng dài ở bên phải.

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; 
+0

Tôi đã thử get_line(), nhưng nó giữ in ấn sau put() trước khi chờ đợi cho đầu vào vì lý do nào.Tôi thực sự nhận được đầu vào từ bàn phím, nhưng đôi khi sử dụng một tập tin đầu vào cũng có. Tôi sẽ xem nếu tôi có thể làm cho nó hoạt động với Move(). Cảm ơn. – user1279914

+1

Bạn có thể thấy hiệu ứng được mô tả [ở đây] (http://stackoverflow.com/a/10472352/230513). Ping tôi ở đây nếu bạn cập nhật câu hỏi của mình bằng mã mới. – trashgod

Các vấn đề liên quan