在這個問題的結束,它看起來像你所要求的在Ada的字符串處理幫助。
是的,Ada字符串確實最好作爲靜態字符串處理,而不是調整大小的緩衝區。有三種典型的方法來解決這個問題。
第一個是製作一個非常大的String
緩衝區,使用單獨的Natural
變量來保存字符串的邏輯長度。這是一種痛苦,並且有點容易出錯,但是至少比C的方法在緩衝區末尾持續掃描null值的方法快。
第二個是隻是踢和使用Ada.Strings.Unbounded.Unbounded_String。這是大多數人所做的事情,因爲如果你習慣以程序的方式來思考事情,那麼這是最容易的。
第三,(我更喜歡的時候可能)是處理你的字符串功能。您需要的主要洞察是Ada String
確實是靜態的,但是您可以控制它們的生命週期,並且如果您在功能上編程,則可以隨時動態創建靜態字符串。
function Matches_Token (Scanned : String) return boolean; --// Returns true if the given string is a token
function Could_Match_Longer (Scanned : String) return boolean; --// Returns true if the given string could be part of a larger token.
function Get_Next_Char return Character; --// Returns the next character from the stream
procedure Unget; --// Puts the last character back onto the stream
procedure Advance (Amount : Natural); --// Advance the stream pointer the given amount
function Longest_Matching_Token (Scanned : String) return String is
New_Token : constant String := Scanned & Get_Next_Char;
begin
--// Find the longest token a further scan can match
if Could_Match_Longer(New_Token) then
declare
LMT : constant String := Longest_Matching_Token (New_Token);
begin
if LMT /= "" then
unget;
return LMT;
end if;
end;
end if;
--// See if this string at least matches.
if Matches_Token(New_Token) then
unget;
return New_Token;
else
unget;
return "";
end if;
end Build_Token;
function Get_Next_Token return String is
Next_Token : constant String := Build_Token("");
begin
Advance (Next_Token'length);
return Next_Token;
end Get_Next_Token;
這並不總是字符串的最有效的方法:
舉例來說,我可以做一些像下面創建一個新的Token
字符串的任何長度我想(與理論上無限前瞻)處理(太多的堆棧使用),但它通常是最簡單的。
實際上,掃描和解析實際上是一種特殊情況的應用程序,其中通常避免的醜陋的東西,如緩衝區(方法1)和gotos通常是可取的。
「sudo」還是僞? – Coffee
IsAlNumOrUnderscore! –