我正在尝试用Java或C++编写一个相当于split()方法的Ada。我将接受一个字符串和一个整数,并输出两个独立的字符串值。例如:"hello“和2的拆分将返回:”第一部分是he,第二部分是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()函数。如有任何建议或帮助,我们将不胜感激。谢谢
发布于 2013-02-20 10:57:28
考虑使Split成为具有两个out参数的procedure,而不是function,如您所示。然后决定Pos是Part1的最后一个索引还是Part2的第一个索引;我选择了后者。
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
type String is array(Positive range <>) of Character;
subtype Positive is Integer range 1 .. Integer'Last;发布于 2013-02-21 23:24:06
做这件事是如此的琐碎,我不知道你为什么要费心为它做一个例程。无论如何,你能想出的任何例程都将很难使用。
Front_Half : constant String := Original(Original'first..Index);
Back_Half : constant String := Original(Index+1..Original'last);好了。
请注意,静态Ada字符串与C或Java等其他语言中的字符串有很大不同。由于它们的静态性质,它们最好像我上面所做的那样内联构建,或者作为函数的返回值。由于函数不能返回一个以上的值,单个统一的“拆分”例程显然不适合静态Ada字符串处理。相反,您应该像我上面所做的那样,从Ada.Strings.Fixed (Head和Tail)调用相应的例程,或者切换到使用Ada.Strings.Unbounded.Unbounded_String而不是String。
如果您希望保持Java对字符串处理的思维定势,那么后者可能是最简单的选择。如果你真的想学习Ada,我强烈建议你学会用Ada的方式来处理静态的固定String。
发布于 2013-02-20 09:37:47
通过查看您的代码,您确实需要大致阅读一下String type,因为您从其他语言中引入了许多关于如何使用它们的期望--这些期望对它们是行不通的。Ada的字符串类型不是其更灵活的特性之一,因为它们总是固定长度。虽然有一些方法可以在您描述的情况下绕过这些限制,但简单地使用Unbounded_Strings会容易得多。
函数的输入字符串可以保持字符串类型,这将根据您提供给它的字符串的长度进行调整。然后,在对两个输出Unbounded_Strings分别调用To_Unbounded_String()之后,将它们简单地设置为分片的字符串组件。
https://stackoverflow.com/questions/14970642
复制相似问题