字符串输出奇怪

时间:2014-06-28 16:29:39

标签: string ada

我是阿达的新手,在约翰巴恩斯的一本书的帮助下,我正在努力自学。

在尝试使用字符串时,我编写了一个非常基本的程序来从键盘读取用户输入,然后再将其输出到控制台。但是,在生成输出时,它似乎包含尚未显式键入的其他字符。看看它,我的直觉反应是它与unicode / Konsole相关,但我绝对无法打折它是否是我在我的代码中做错了。

我附上了该程序及其输出的屏幕截图。任何想法都将不胜感激。

enter image description here

谢谢!

Image showing code and output

1 个答案:

答案 0 :(得分:3)

区别在于字符串不是空终止;他们完全和他们说的一样长:在这种情况下,100个字符。

并非您示例中的所有字符都是您键入的内容。

快速修复:仅输出您输入的Len字符...

   Put_Line ("Your String: '" & UserString(1 .. Len) & "' (Chars: " & natural'image(Len) & ")");

(我使用标准的可移植natural'image(Len)而不是编译器特定的Len'img形式)

这留下了一些遗留问题:

  • 如果您输入超过100个字符,结果将是安全的但不能令人满意。
  • 您需要在需要字符串的任何位置指定切片边界(1..Len)。

更好的修复:创建一个完全符合您输入长度的字符串。最简单的方法是调用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_StringUnbounded_String的技术,但这里并不是必需的。