我已经定义了
subtype String10 is String(1..10);
并且我试图获得键盘输入,而不必在输入之前手动输入空格。我尝试了get_line()但是由于某种原因它在输出get put()命令之前实际上不会等待输入,而且我也认为它会在那之前留下字符串中的内容并且不用空格填充它。 / p>
我知道并使用过Bounded_String和Unbounded_String,但我想知道是否有办法让这项工作。
我尝试过为它制作一个功能:
--getString10--
procedure getString10(s : string10) is
c : character;
k : integer;
begin
for i in integer range 1..10 loop
get(c);
if Ada.Text_IO.End_Of_Line = false then
s(i) := c;
else
k := i;
exit;
end if;
end loop;
for i in integer range k..10 loop
s(i) := ' ';
end loop;
end getString10;
但是,在这里,我知道s(i)
不起作用,我不认为
"if Ada.Text_IO.End_Of_Line = false then"
做我希望它会做的事情。当我寻找实际的方法时,它只是一个占位符。
我现在已经搜索了几个小时,但是Ada文档不像其他语言那样可用或清晰。我找到了很多关于获取字符串的内容,但不是我正在寻找的内容。
答案 0 :(得分:7)
在调用Get_Line
之前,只需使用空格预先初始化字符串。
这是我刚刚聚集在一起的一个小程序:
with Ada.Text_IO; use Ada.Text_IO;
procedure Foo is
S: String(1 .. 10) := (others => ' ');
Last: Integer;
begin
Put("Enter S: ");
Get_Line(S, Last);
Put_Line("S = """ & S & """");
Put_Line("Last = " & Integer'Image(Last));
end Foo;
以及运行时得到的输出:
Enter S: hello
S = "hello "
Last = 5
另一种可能性,而不是预先初始化字符串,是在<{em> Get_Line
调用之后将余数设置为空格:
with Ada.Text_IO; use Ada.Text_IO;
procedure Foo is
S: String(1 .. 10);
Last: Integer;
begin
Put("Enter S: ");
Get_Line(S, Last);
S(Last+1 .. S'Last) := (others => ' ');
Put_Line("S = """ & S & """");
Put_Line("Last = " & Integer'Image(Last));
end Foo;
对于非常大的数组,后一种方法可能更有效,因为它不会将字符串的初始部分分配两次,但实际上差异不太可能很大。
答案 1 :(得分:3)
作为替代方法,使用function Get_Line
,它返回一个固定长度String
,其“下限为1,读取的字符数上限”。示例Line_By_Line
使用从文件中读取的变体。如果需要,您可以使用procedure Move
将Source
字符串复制到Target
字符串;默认情况下,该过程会自动填充空格。
附录:例如,这Line_Test
张贴*
并默默截断右边的长行。
with Ada.Integer_Text_IO;
with Ada.Strings.Fixed;
with Ada.Text_IO;
procedure Line_Test is
Line_Count : Natural := 0;
Buffer: String(1 .. 10);
begin
while not Ada.Text_IO.End_Of_File loop
declare
Line : String := Ada.Text_IO.Get_Line;
begin
Line_Count := Line_Count + 1;
Ada.Integer_Text_IO.Put(Line_Count, 0);
Ada.Text_IO.Put_Line(": " & Line);
Ada.Strings.Fixed.Move(
Source => Line,
Target => Buffer,
Drop => Ada.Strings.Right,
Justify => Ada.Strings.Left,
Pad => '*');
Ada.Integer_Text_IO.Put(Line_Count, 0);
Ada.Text_IO.Put_Line(": " & Buffer);
end;
end loop;
end Line_Test;