字符串输出奇怪

标签 string ada

我对 Ada 来说是个新手,我正在尝试在约翰·巴恩斯 (John Barnes) 的一本书中的帮助下自学。

在涉足字符串时,我编写了一个非常基本的程序来从键盘读取用户输入,然后再次将其输出到控制台。但是,当生成输出时,它似乎包含尚未显式键入的其他字符。看着它,我的直觉 react 是它与 unicode/Konsole 相关,但我绝对不能否认这是否是我在代码中做错的事情。

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

enter image description here

谢谢!

Image showing code and output

最佳答案

区别在于字符串不是以 null 结尾的;它们的长度与他们所说的一样长:在本例中为 100 个字符。

并非示例中的所有字符都是您输入的。

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

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

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

这留下了一些遗留问题:

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

更好的解决方法:创建一个与您键入的长度完全相同的字符串。最简单的方法是调用 Get_Line 的函数形式,并从函数的返回值初始化一个不受约束的字符串。无约束字符串在声明时没有定义长度,它从初始化中获取长度。为此,我们可以开始一个新的 block ......

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 变量。字符串的长度是字符串的一个属性,而不是可能被错误管理的单独数量;少一件容易出错的事情。

声明 block 是一种安全而强大的技术,用于分配运行时大小的存储,而不需要堆分配例程、指针、释放等。出错的地方更少。

UserString设为Constant通常是个好主意(感谢Simon!)。不是必需的(否则您可以就地编辑它,但不能更改其长度),但假设您不打算编辑它 - 就少了一件容易出错的事情。

还有其他涉及 Bounded_StringUnbounded_String 的技术,但它们在这里并不是真正必要的。

关于字符串输出奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24468813/

相关文章:

python - 从 python 字符串中删除最后的 0

java - 为什么 byteArray 的长度是 22 而不是 20?

c - 如何按值传递 char ** 指针?

c++ - 在 Ada95/构造函数和受控类型中使用 C++ 类

pointers - 通用访问类型 Ada

Ada Get_Line 不等待获取响应

C++ - 尝试使用字符串函数来反转输入字符串

c++ - 为什么 Protocol Buffer 字节在 C++ 中是字符串?

ada - pragma Task_Dispatching_Policy(Non_Preemptive_FIFO_Within_Priorities)的用法示例;

新项目的艾达?