Ада - обрезать и удалять специальные символы на строки - PullRequest
1 голос
/ 16 ноября 2011

У меня есть переменная с именем Input

Input : STRING (1 .. 80) ; 

Я использую Ada.Strings и Ada.Text_IO в качестве библиотеки, и мне нужно знать, могу ли я и каким образом удалять пробелы и специальные символы (такие как апекс, запятая и точка) во входной переменной.

Ответы [ 3 ]

3 голосов
/ 16 ноября 2011

Если у вас есть Ada.Strings, скорее всего, у вас есть Ada.Strings.Fixed и Ada.Strings.Maps.

Используйте метод (ы) Ada.Strings.Fixed.Translate с помощью Ada.Strings.Maps для перевода любых символов в любые другие символы.

В качестве альтернативы вы можете просто зацикливать свою входную строку и добавлять только те символы, которые хотите добавить в новую строку.(менее элегантно, но вам не нужны никакие другие библиотеки)

2 голосов
/ 16 ноября 2011

Пакеты Ada.Strings.Maps , вероятно, будут здесь очень полезны, в частности, функции "To_Set" (определяют символы, которые вы хотите выделить в Character_Sequence) и функции "Is_In".

Поскольку вы удаляете, а не заменяете символы, вам придется перебирать строку, проверяя, находится ли каждый из них в наборе тех, которые нужно удалить. Если это так, не добавляйте его в буфер выходной строки.

1 голос
/ 16 ноября 2011

Ну, во-первых, вы должны понимать, что если вы хотите удалить символ потенциально из середины строки, все символы после удаленного символа должны быть смещены влево на один символ.Это не Ada-специфическая проблема.Если строка большая, это может быть довольно неэффективно.Я бы не назвал 80 символов или менее «большими».

Второе, что вы должны понять, это то, что в Ada, в отличие от многих языков, строки должны иметь идеальный размер.Это означает, что если вы собираетесь использовать переменную String в качестве буфера (например, для ввода через Text_IO), вам также придется отслеживать фактическую длину допустимых данных в ней с другой переменной.

Учитывая это, можно легко написать код, который распознает символы, которые вам там не нужны, и удаляет их примерно так:

if (Bad_Index < Input_Length) then
    Input(Bad_Index .. Input_Length - 1) := Input(Bad_Index + 1 .. Input_Length);
end if;
Input_Length := Input_Length - 1;

Однако это своего родаТрудный путь.Если у вас действительно есть строка, которой вы хотите манипулировать таким образом, вероятно, проще всего поместить ее в неограниченный строковый объект.Ada.Strings.Unbounded.Find_Token и Ada.Strings.Unbounded.Delete будут делать то, что вам нужно, и все, что вам нужно написать, - это цикл вокруг них.

...