我已经定义
subtype String10 is String(1..10);
并且我试图在不按回车键之前手动输入空格的情况下获得键盘输入。我尝试了get_line(),但是由于某种原因,它实际上不会等待输入,然后才输出get put()命令,而且我也认为它只会在字符串之前留下任何内容,而不会用空格填充它。
我知道并使用了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文档不如其他语言那么可用或清晰。我发现了很多有关获取字符串的信息,但不是我要找的东西。
最佳答案
只需在调用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
除了预先初始化字符串之外,另一种可能性是在
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;
对于非常大的数组,后一种方法可能会更有效,因为它不会两次分配字符串的初始部分,但实际上差异不大。