1

我有一个名为 Input 的变量

Input : STRING (1 .. 80) ; 

我使用 Ada.Strings 和 Ada.Text_IO 作为库,我需要知道是否可以以及如何删除输入变量上的空格和特殊字符(例如顶点、逗号和句点)。

4

3 回答 3

3

如果你有Ada.Strings,你很可能有Ada.Strings.Fixedand Ada.Strings.Maps

Ada.Strings.Fixed.Translate在from 的帮助下使用方法Ada.Strings.Maps将任何字符转换为任何其他字符。

或者,您可以只循环输入字符串,只将您想要的字符附加到新字符串。(不太优雅,但你不需要任何其他库)

于 2011-11-16T14:07:20.307 回答
2

Ada.Strings.Maps包在这里可能会很有帮助,尤其是“To_Set”(定义要在 Character_Sequence 中去除的字符)和“Is_In”函数。

由于您要删除而不是替换字符,因此您必须遍历字符串,检查每个字符是否“在”要删除的字符集中。如果是这样,请不要将其附加到输出字符串缓冲区。

于 2011-11-16T14:15:18.877 回答
1

嗯,首先你必须明白,如果你想从字符串中间删除一个字符,那么删除字符之后的所有字符都必须移到左边一个字符。这不是 Ada 特有的问题。如果字符串很大,这可能是相当低效的。不过,我不会称 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会做你需要的,你所要做的就是围绕它们循环。

于 2011-11-16T14:13:27.670 回答