1

Input という変数があります

Input : STRING (1 .. 80) ; 

ライブラリとして Ada.Strings と Ada.Text_IO を使用していますが、入力変数でスペースと特殊文字 (頂点、カンマ、ピリオドなど) を削除できるかどうか、およびその方法を知る必要があります。

4

3 に答える 3

3

を持っている場合はAda.Strings、おそらく と を持っていAda.Strings.FixedますAda.Strings.Maps

Ada.Strings.Fixed.Translateの支援を受けてメソッドを使用して、Ada.Strings.Maps任意の文字を他の文字に変換します。

または、入力文字列をループして、必要な文字のみを新しい文字列に追加することもできます。(エレガントではありませんが、他のライブラリは必要ありません)

于 2011-11-16T14:07:20.307 に答える
2

ここでは、 Ada.Strings.Mapsパッケージ、特に「To_Set」(Character_Sequenceで削除する文字を定義する)および「Is_In」関数が非常に役立つ可能性があります。

文字を置き換えるのではなく削除するので、文字列を繰り返し処理して、削除する文字のセットに各文字が「含まれているか」を確認する必要があります。その場合は、出力文字列バッファに追加しないでください。

于 2011-11-16T14:15:18.877 に答える
1

最初に、文字列の途中から文字を削除したい場合、削除された文字の後のすべての文字を左に 1 文字ずらす必要があることを理解する必要があります。これは Ada 固有の問題ではありません。文字列が大きい場合、これはかなり非効率的です。ただし、80 文字以下を「大きい」とは言いません。

2 番目に理解しなければならないことは、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_TokenAda.Strings.Unbounded.Delete

于 2011-11-16T14:13:27.670 に答える