2011-11-16 29 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”函数。

既然你删除,而不是替换,字符,你必须通过串迭代,检查,看看每一个是否“是在”集合那些被删除。如果是这样,请不要将其附加到输出字符串缓冲区。