我有一个名为Input
的变量Input : STRING (1 .. 80) ;
我使用Ada.Strings和Ada.Text_IO作为库,我需要知道是否可以以及如何删除输入变量上的空格和特殊字符(例如顶点,逗号和句点)。
答案 0 :(得分:3)
如果您有Ada.Strings
,则很可能有Ada.Strings.Fixed
和Ada.Strings.Maps
。
在Ada.Strings.Fixed.Translate
的帮助下使用Ada.Strings.Maps
方法将任何字符翻译为任何其他字符。
或者,您可以循环输入字符串,只将想要的字符附加到新字符串。 (不太优雅,但你不需要任何其他库)
答案 1 :(得分:2)
这里的Ada.Strings.Maps软件包可能会非常有用,特别是“To_Set”(定义你想要在Character_Sequence中删除的字符)和“Is_In”函数。
由于您正在删除而不是替换字符,因此您必须遍历该字符串,检查每个字符串是否“存在”要删除的字符集中。如果是这样,请不要将其附加到输出字符串缓冲区。
答案 2 :(得分:1)
嗯,首先你需要明白,如果你想从字符串中间删除一个字符,删除后的字符后面的所有字符都必须转移到左边的一个字符。这不是一个特定的问题。如果字符串很大,这可能效率很低。我不会打80个字符或更少“大”。
你必须要理解的第二件事是,在Ada中,与许多语言不同,字符串的大小非常合适。这意味着如果您要使用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
会做你需要的,而你所要写的就是围绕它们的循环。