ada split()方法

string parameters split ada

4504 观看

5回复

444 作者的声誉

我试图在Java或C ++中编写一个等同于split()方法的Ada。我要输入一个字符串和一个整数,并输出两个单独的字符串值。例如:拆分“hello”和2将返回:“第一部分是他,第二部分是llo”

我的代码如下:

-- split.adb splits an input string about a specified position.
--
-- Input: Astring, a string,
--        Pos, an integer.
-- Precondition: pos is in Astring'Range.
-- Output: The substrings Astring(Astring'First..Pos) and
--                        Astring(Pos+1..Astring'Last).
--------------------------------------------------------------

with Ada.Text_IO, Ada.Integer_Text_IO, Ada.Strings.Fixed;
use  Ada.Text_IO, Ada.Integer_Text_IO, Ada.Strings.Fixed;

procedure Split is

   EMPTY_STRING : String := "                                        ";

   Astring, Part1, Part2 : String := EMPTY_STRING;
   Pos, Chars_Read       : Natural;

   ------------------------------------------------
   -- Split() splits a string in two.           
   -- Receive: The_String, the string to be split,
   --          Position, the split index.        
   -- PRE: 0 < Position <= The_String.length(). 
   --     (Ada arrays are 1-relative by default)
   -- Passback: First_Part - the first substring,
   --           Last_Part - the second substring.
   ------------------------------------------------
   function Split(TheString : in String ; Pos : in Integer; Part1 : out String ; Part2     : out String)  return String is 
   begin
    Move(TheString(TheString'First .. Pos), Part1);
    Move(TheString(Pos .. TheString'Last), Part2);
    return Part1, Part2;
     end Split;



begin                                           -- Prompt for input
   Put("To split a string, enter the string: ");
   Get_Line(Astring, Chars_Read);
   Put("Enter the split position: ");
   Get(Pos);

   Split(Astring, Pos, Part1, Part2);

   Put("The first part is ");
   Put_Line(Part1);
   Put(" and the second part is ");
   Put_Line(Part2);

end Split;

我遇到问题的主要部分是返回两个单独的字符串值,通常是整个split()函数。任何指针或帮助表示赞赏。谢谢

作者: ola 的来源 发布者: 2013 年 2 月 20 日

回应 5


3

7685 作者的声誉

通过查看代码,你真的需要一般性地阅读String类型,因为你在其他语言中拖了很多关于如何使用它们的期望 - 这些都不适用于它们。Ada的String类型不是其更灵活的功能之一,因为它们总是固定长度。虽然有一些方法可以解决您所描述的情况下的限制,但简单地使用Unbounded_Strings会更容易。

函数的输入String可以保留String类型,它将调整为您提供给它的字符串的长度。然后,在每个上面调用To_Unbounded_String()之后,将两个输出Unbounded_Strings简单地设置为切片的字符串组件。

作者: Marc C 发布者: 2013 年 2 月 20 日

3

187105 作者的声誉

决定

而不是a function,考虑制作Split一个procedure有两个out参数,如你所示。然后决定是否Pos最后一个索引Part1或第一个索引Part2; 我选择了后者。

请注意,String索引是Positive

作者: trashgod 发布者: 2013 年 2 月 20 日

1

15269 作者的声誉

考虑到主程序的限制,所有字符串都以EMPTY_STRING的大小为界。带有out参数的过程是正确的方法,调用者分配out参数存储(在堆栈发生时)

情况并非总是如此,因此值得了解另一种方式。问题是如何在运行时处理大小未知的数据。

有些语言只能在堆上提供运行时分配(通过“new”或“malloc”),并且只能通过指针访问数据,留下各种混乱问题,包括访问数据末尾(缓冲区溢出)或释放正确存储(内存泄漏,访问释放的指针等)

Ada也允许这种方法,但通常是不必要的,并且强烈建议不要这样做。Unbounded_String是此方法的包装器,而Bounded_String避免了堆分配,您可以在其中接受字符串长度的上限。

而且,Ada允许在堆栈上创建可变大小的数据结构; 该技术只需要创建一个新的堆栈框架并在需要的地方声明新的变量,并使用“declare”。可以使用函数调用初始化新变量。

每个函数只能返回一个对象,但该对象的大小可以在运行时确定。因此,“Split”可以实现为2个函数,返回Part1或Part2,或者它可以返回包含两个字符串的记录。这将是一个有两个大小判别的记录,所以我在这里选择了更简单的选项。功能结果通常就位(避免复制)。

示例中的流程需要两个嵌套的Declare块; 如果可以首先识别“Pos”,它们可以折叠成一个......

这显然可以包含在一个循环中,每次都有不同大小的字符串,没有内存管理问题。

作者: Brian Drummond 发布者: 2013 年 2 月 20 日

4

36126 作者的声誉

这样做是微不足道的,我不知道为什么你会为此做一个例程。无论如何,几乎任何你能想到的例行程序都会变得更加困难。

Front_Half : constant String := Original(Original'first..Index);
Back_Half  : constant String := Original(Index+1..Original'last);

完成。

请注意,静态Ada字符串与其他语言(如C或Java)中的字符串非常不同。由于它们的静态特性,它们最好像我上面所做的那样内联,或者作为函数的返回值。由于函数不能返回多个值,因此单个统一的“拆分”例程通常不适合静态Ada字符串处理。相反,你应该做我上面做的,从Ada.Strings.Fixed(HeadTail)调用相应的例程,或切换到使用Ada.Strings.Unbounded.Unbounded_String而不是String

如果你想保持关于字符串处理的Java思维方式,后者可能是最简单的选择。如果你想真正学习Ada,我强烈建议你学会用StringAda方式处理静态修复。

作者: T.E.D. 发布者: 2013 年 2 月 21 日

0

1 作者的声誉

查看Ada.Strings.Fixed中的Head和Tail函数。

function Head (Source : in String; Count : in Natural; Pad : in Character := Space) return String;

function Tail (Source : in String; Count : in Natural; Pad : in Character := Space) return String;

作者: Brian 发布者: 2019 年 2 月 28 日
32x32