Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ada String Concatenation

Tags:

ada

I have a function that returns a string for a particular item, and I need to call that function numerous times and combine those strings into one. The combined string is bounded. I've made sure to fill it when space characters when it initializes but I keep getting "length check failed" errors. Is there something basic I'm doing wrong here?

FOR I IN 1..Collection.Size LOOP  
    Combined_String :=  combined_string & Tostring(Collection.Book(I));  
END LOOP;
like image 855
n0dnarb Avatar asked Feb 14 '11 02:02

n0dnarb


People also ask

How do I concatenate strings in Ada?

You can assign a whole string from one String to another the same way as any other variable, as long as their lengths are equal, like this: B := A; You can concatenate (combine) strings together using the "&" operator.

What is string concatenation with example?

In Java, String concatenation forms a new String that is the combination of multiple strings. There are two ways to concatenate strings in Java: By + (String concatenation) operator. By concat() method.

Does C++ have string concatenation?

C++ has a built-in method to concatenate strings. The strcat() method is used to concatenate strings in C++. The strcat() function takes char array as input and then concatenates the input values passed to the function.

What is the concatenation of two strings?

The concatenation of strings is a process of combining two strings to form a single string. If there are two strings, then the second string is added at the end of the first string. We can concatenate the strings in the following three ways: Concatenate two strings using loop.


2 Answers

Unbounded_String is probably the easiest way to go:

with Ada.Strings.Unbounded;
use Ada.Strings.unbounded;

   ...

Temp_Unbounded_String : Unbounded_String;  -- Is empty by default.

   ...

for I in 1 .. Collection.Size loop
   Append(Temp_Unbounded_String, ToString(Collection.Book(I));
end loop;

If you then need to have the result placed in your fixed length standard string:

declare
   Temp_String : constant String := To_String(Temp_Unbounded_String);
begin
   -- Beware! If the length of the Temp_String is greater than that of the
   -- fixed-length string, a Constraint_Error will be raised.  Some verification
   -- of source and target string lengths must be performed!
   Combined_String(Temp_String'Range) := Temp_String;
end;

Alternatively, you can use the Ada.Strings.Fixed Move() procedure to bring the Unbounded_String into the target fixed-length string:

Ada.Strings.Fixed.Move(To_String(Temp_Unbounded_String), Combined_String);

In this case, if the source string is "too long", by default a Length_Error exception is raised. There are other parameters to Move() that can modify the behavior in that situation, see the provided link on Move for more detail.

like image 170
Marc C Avatar answered Oct 22 '22 04:10

Marc C


In order to assign Combined_String, you must assign the full correct length at once. You can't "build up" a string and assign it that way in Ada.

Without seeing the rest of your code, I think Ada.Strings.Unbounded is probably what you should be using.

like image 22
Dave Avatar answered Oct 22 '22 06:10

Dave