2011-11-16 37 views
1

我呼籲輸入阿達 - 修剪和串

Input : STRING (1 .. 80) ; 

我用Ada.Strings和Ada.Text_IO爲庫變量刪除特殊字符,我需要知道我是否能夠以及如何去除輸入變量上的空格和特殊字符(例如頂點,逗號和句點)。

回答

3

如果您有Ada.Strings,您很可能有Ada.Strings.FixedAda.Strings.Maps

的協助下Ada.Strings.Maps使用Ada.Strings.Fixed.Translate方法(縣)任何字符轉換爲其他字符。

或者你可以在你輸入字符串循環,只有追加要一個新的字符串中的字符。 (不太優雅,但你不需要任何其他庫)

+1

我不認爲'翻譯'會做他想做的事情,因爲他必須找到其他角色來將不受歡迎的人變成。不過我喜歡你的選擇。它比我提出的可能多次移動原始字符更有效,並且具有單獨保留原始輸入字符串的好處。 –

1

嗯,首先你要明白,如果你想從一個字符串中間可能刪除字符,刪除的字符之後的所有字符將有被轉移到左邊的一個字符。這不是一個特定於Ada的問題。如果字符串很大,這可能效率很低。儘管如此,我不會稱80個字符或更少的「大」。

你要了解的第二件事是,在阿達,與許多語言中,字符串意味着是完美尺寸。這意味着如果你打算使用String變量作爲緩衝區(例如:通過Text_IO輸入),你還必須跟蹤另一個變量的有效數據的實際長度。

鑑於這種情況,它可以編寫代碼來識別你不想在那裏字符的簡單的事情,並且用類似其刪除:

if (Bad_Index < Input_Length) then 
    Input(Bad_Index .. Input_Length - 1) := Input(Bad_Index + 1 .. Input_Length); 
end if; 
Input_Length := Input_Length - 1; 

然而,這是一種硬的辦法。如果你真的想要以這種方式操作字符串,那麼最簡單的方法就是將它放入一個無界的字符串對象中。 Ada.Strings.Unbounded.Find_TokenAda.Strings.Unbounded.Delete會做你所需要的,你所要寫的只是一個循環。

+0

是的,我知道,我可以使用Ada.Strings.Unbounded,但我不能,因爲我必須這樣做,而不:( –

+0

@ClaudioLudovicoMalorgio - 爲什麼?如果你有進一步的限制(作業,沒有動態分配可由於在運行小型嵌入式系統等),你真的應該把它放在你的問題上。 –

2

Ada.Strings.Maps包在這裏可能會非常有用,特別是「To_Set」(定義要在Character_Sequence中去掉的字符)和「Is_In」函數。

既然你刪除,而不是替換,字符,你必須通過串迭代,檢查,看看每一個是否「是在」集合那些被刪除。如果是這樣,請不要將其附加到輸出字符串緩衝區。