2017-04-12 46 views

回答

3

從標準輸入中讀取一個單詞。作爲函數書寫。 (未測試)。

function Next_Word return String is 
    package Latin_1 renames Ada.Characters.Latin_1; 

    subtype Whitespace is Character 
    with Static_Predicate => Whitespace in ' ' | Latin_1.HT; 

    use all type Ada.Strings.Unbounded.Unbounded_String; 

    Word : Ada.Strings.Unbounded.Unbounded_String; 
    Next : Character; 
begin 
    Skip_Leading_Space: 
    loop 
     Ada.Text_IO.Get (Next); 
     exit when not (Next in Whitespace); 
    end loop Skip_Leading_Space; 

    Read_Word: 
    loop 
     Word := Word & Next; 
     Ada.Text_IO.Get (Next); 
     exit when Next in Whitespace; 
    end loop Read_Word; 

    return To_String (Word); 
end Next_Word; 
2
Skip_Leading_Space: 
loop 
    Next := Ada.Text_IO.Get; 
    exit when not Next in Whitespace; 
end loop Skip_Leading_Space; 

Read_Word: 
loop 
    Word := Word & Next; 
    Next := Ada.Text_IO.Get; 
    exit when Next in Whitespace; 
end loop Read_Word; 
+2

標籤可以使代碼更清晰,而且顯然可以使用in,in/out和out參數來使其成爲一個過程。您也可以使其成爲函數,但取決於您使用的Ada修訂版本,您可能無法使用所有類型的參數傳遞模式。 –

+1

我太老師了,第一次提供完整的解決方案。 ;-) –

+2

我絕對不會放棄標籤,因爲它們使得源代碼更易於閱讀。 –

2

要掃描,所以最好使用什麼是用於此目的的阿達標準庫提供。一名候選人是Ada.Strings.Fixed.Find_Token

with Ada.Strings.Fixed, Ada.Strings.Maps.Constants, Ada.Text_IO; 
use Ada.Text_IO, Ada.Strings; 

procedure Read_Word is 
    Text : constant String := Get_Line; 
    First : Positive; 
    Last : Natural; 
    White : Maps.Character_Set := Maps.To_Set (" "); 
begin 
    Fixed.Find_Token 
     (Source => Text, 
     Set => White, 
     Test => outside, 
     First => First, 
     Last => Last); 
    Put_Line ("word is: " & Text (First .. Last) & '.'); 
end Read_Word;