首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ada split()方法

ada split()方法
EN

Stack Overflow用户
提问于 2013-02-20 09:13:58
回答 6查看 6.7K关注 0票数 3

我正在尝试用Java或C++编写一个相当于split()方法的Ada。我将接受一个字符串和一个整数,并输出两个独立的字符串值。例如:"hello“和2的拆分将返回:”第一部分是he,第二部分是llo“

我的代码如下:

代码语言:javascript
复制
-- 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()函数。如有任何建议或帮助,我们将不胜感激。谢谢

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-02-20 10:57:28

考虑使Split成为具有两个out参数的procedure,而不是function,如您所示。然后决定PosPart1的最后一个索引还是Part2的第一个索引;我选择了后者。

代码语言:javascript
复制
procedure Split(
   TheString : in String; Pos : in Integer;
   Part1 : out String; Part2 : out String) is 
begin
   Move(TheString(TheString'First .. Pos - 1), Part1);
   Move(TheString(Pos .. TheString'Last), Part2);
end Split;

请注意,String索引是Positive

代码语言:javascript
复制
type String is array(Positive range <>) of Character;
subtype Positive is Integer range 1 .. Integer'Last;
票数 4
EN

Stack Overflow用户

发布于 2013-02-21 23:24:06

做这件事是如此的琐碎,我不知道你为什么要费心为它做一个例程。无论如何,你能想出的任何例程都将很难使用。

代码语言:javascript
复制
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,我强烈建议你学会用Ada的方式来处理静态的固定String

票数 4
EN

Stack Overflow用户

发布于 2013-02-20 09:37:47

通过查看您的代码,您确实需要大致阅读一下String type,因为您从其他语言中引入了许多关于如何使用它们的期望--这些期望对它们是行不通的。Ada的字符串类型不是其更灵活的特性之一,因为它们总是固定长度。虽然有一些方法可以在您描述的情况下绕过这些限制,但简单地使用Unbounded_Strings会容易得多。

函数的输入字符串可以保持字符串类型,这将根据您提供给它的字符串的长度进行调整。然后,在对两个输出Unbounded_Strings分别调用To_Unbounded_String()之后,将它们简单地设置为分片的字符串组件。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14970642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档