我呼籲輸入阿達 - 修剪和串
Input : STRING (1 .. 80) ;
我用Ada.Strings和Ada.Text_IO爲庫變量刪除特殊字符,我需要知道我是否能夠以及如何去除輸入變量上的空格和特殊字符(例如頂點,逗號和句點)。
我呼籲輸入阿達 - 修剪和串
Input : STRING (1 .. 80) ;
我用Ada.Strings和Ada.Text_IO爲庫變量刪除特殊字符,我需要知道我是否能夠以及如何去除輸入變量上的空格和特殊字符(例如頂點,逗號和句點)。
如果您有Ada.Strings
,您很可能有Ada.Strings.Fixed
和Ada.Strings.Maps
。
的協助下Ada.Strings.Maps
使用Ada.Strings.Fixed.Translate
方法(縣)任何字符轉換爲其他字符。
或者你可以在你輸入字符串循環,只有追加要一個新的字符串中的字符。 (不太優雅,但你不需要任何其他庫)
嗯,首先你要明白,如果你想從一個字符串中間可能刪除字符,刪除的字符之後的所有字符將有被轉移到左邊的一個字符。這不是一個特定於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_Token
和Ada.Strings.Unbounded.Delete
會做你所需要的,你所要寫的只是一個循環。
是的,我知道,我可以使用Ada.Strings.Unbounded,但我不能,因爲我必須這樣做,而不:( –
@ClaudioLudovicoMalorgio - 爲什麼?如果你有進一步的限制(作業,沒有動態分配可由於在運行小型嵌入式系統等),你真的應該把它放在你的問題上。 –
Ada.Strings.Maps包在這裏可能會非常有用,特別是「To_Set」(定義要在Character_Sequence中去掉的字符)和「Is_In」函數。
既然你刪除,而不是替換,字符,你必須通過串迭代,檢查,看看每一個是否「是在」集合那些被刪除。如果是這樣,請不要將其附加到輸出字符串緩衝區。
我不認爲'翻譯'會做他想做的事情,因爲他必須找到其他角色來將不受歡迎的人變成。不過我喜歡你的選擇。它比我提出的可能多次移動原始字符更有效,並且具有單獨保留原始輸入字符串的好處。 –