我是阿达的新手,在约翰巴恩斯的一本书的帮助下,我正在努力自学。
在尝试使用字符串时,我编写了一个非常基本的程序来从键盘读取用户输入,然后再将其输出到控制台。但是,在生成输出时,它似乎包含尚未显式键入的其他字符。看看它,我的直觉反应是它与unicode / Konsole相关,但我绝对无法打折它是否是我在我的代码中做错了。
我附上了该程序及其输出的屏幕截图。任何想法都将不胜感激。
谢谢!
答案 0 :(得分:3)
区别在于字符串不是空终止;他们完全和他们说的一样长:在这种情况下,100个字符。
并非您示例中的所有字符都是您键入的内容。
快速修复:仅输出您输入的Len字符...
Put_Line ("Your String: '" & UserString(1 .. Len) & "' (Chars: " & natural'image(Len) & ")");
(我使用标准的可移植natural'image(Len)
而不是编译器特定的Len'img
形式)
这留下了一些遗留问题:
更好的修复:创建一个完全符合您输入长度的字符串。最简单的方法是调用Get_Line的函数形式,并从函数的返回值初始化一个无约束的String。无约束的String在声明时没有定义的长度,它从初始化得到它的长度。为此,我们可以开始一个新的块......
Put_Line("Enter a string: ");
declare
UserString : constant String := Get_Line;
-- the string is now the correct length, however much you typed.
begin
Put_Line ("Your String: '" & UserString & "' (Chars: " &
natural'image(UserString'Length) & ")");
-- other processing on UserString here
end;
-- UserString is now out of scope, automatically freed
请注意,不再需要Len
变量。字符串的长度是字符串的属性,而不是可能被错误管理的单独数量;少出错的一件事。
声明块是一种安全且强大的技术,用于分配运行时大小的存储,而不需要堆分配例程,指针,释放等。可能会出现一些问题。
通常一个好主意(感谢Simon!)让UserString
成为Constant
。不是必需的(否则你可以在适当的位置编辑它,但不能改变它的长度),但假设你不打算编辑它 - 少出错一点。
还有其他涉及Bounded_String
或Unbounded_String
的技术,但这里并不是必需的。