У меня проблема.
Я создал массив строк, потому что хочу сохранить некоторые имена в массиве.
Проблема в том, что когда я пишу имя короче 10 символов, программа заполняет массив случайными символами до 10. И я не знаю, как это решить. Я пробовал использовать Ada.Text_IO.Skip_Line
, но он все еще не работает так, как я хочу.
(Проблема взята из экзамена, на котором мы предполагали хранить 5 наименований на револьверах :) ..)
Это код
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
procedure Revolver is
type Pistol is array (1..5) of String(1..10);
procedure Get_namn(Namn: out Pistol) is
X:Integer;
pist:String(1..10);
begin
New_Line;
for I in 1..5 loop
Get_line(Pist,x);
if pist'Last=x then
Skip_Line;
end if;
Namn(I):= Pist;
end loop;
New_Line;
end Get_Namn;
procedure Put_Namn(Namn: in Pistol) is
begin
for I in Namn'range loop
Put(Namn(I));
New_Line;
end loop;
end Put_Namn;
Namn : Pistol;
X : Integer;
begin
Put("Mata in revolvrar: ");
Get_namn(Namn);
Put_Namn(Namn);
end Revolver;
Вы можете решить проблему, инициализировав строки, заполнив их пробелами. - За исключением того, что Get_Line
указан как имеющий Item
в качестве параметра out
. - Придерживайтесь струн фиксированной длины с наполнителем:
declare
Buffer : String (1 .. 20);
Filled_To : Natural;
begin
Ada.Text_IO.Get_Line (Item => Buffer,
Last => Filled_To);
Buffer (Filled_To + 1 .. Buffer'Last) := (others => ' ');
end;
Другой вариант - отслеживать фактическую длину и показывать только ее, когда вы снова распечатываете имена.
Третий вариант - использовать Ada.Strings.Bounded, который отслеживает длину за вас.
Четвертый вариант - использовать Ada.Strings.Unbounded, который использует динамическое выделение для настройки длины сохраненной строки в соответствии с вашими потребностями.
Какое из четырех решений является правильным, не ясно из вашего описания проблемы, но первое проще всего реализовать.
Я не верю, что можно полагаться на "заполнение [...] пробелами". ARM A.7.1 (19) говорит в конце параграфа «Значения не назначенных символов не указаны».
Чтобы заполнить пробелы, посмотрите процедуру перемещения для фиксированной строки ARM A.4.3 (7)
@LouiseHjalmarson Я расширил ответ небольшим количеством кода, который гарантирует, что у вас есть пробелы в оставшейся части строки фиксированной длины, в которую вы читаете строку.
Хорошо, вы видите результат определения вашего типа:
type Pistol is array (1..5) of String(1..10);
Видите ли, вы объявляете массив из пяти элементов, которые представляют собой строки длиной 10.
Кто-то уже упоминал ограниченные и неограниченные строки, но, возможно, вам следует взглянуть на Ada.Containers.Indefinite_Holders
, создать его экземпляр с помощью String
и создать элементы массива из этого контейнера.
Спасибо! Но как мне заполнить массив пробелами?