如何将无界字符串转换为整数?

时间:2018-12-17 14:09:28

标签: ada

我正在学习Ada(尝试https://adventofcode.com/2018/问题)。首先,我正在尝试开发一些“实用程序”软件包,这些软件包将有助于文本处理等。

我已经成功编写了一个函数,该函数将从stdin读取并为每个输入行返回Unbounded_String s数组。

我正在尝试对该函数进行修改以执行相同的操作,但是在将每个Unbounded_String转换为Integer之前,将其插入数组。

这是我的包裹:

get_stdin.ads:

with Ada.Strings.Unbounded;

package get_stdin is
  type IntegerArray is array (Natural range <>) of Integer;
  function get_ints return IntegerArray;

end get_stdin;

get_stdin.adb:

with Ada.Text_IO;
with Ada.Text_IO.Unbounded_IO;
with Ada.Strings.Unbounded;
with Ada.Strings;

package body get_stdin is

  function get_ints return IntegerArray is
    Counter : Natural := 0;
    Str  : Ada.Strings.Unbounded.Unbounded_String;
    Arr  : IntegerArray(0..10000);
  begin
    while not Ada.Text_IO.End_Of_File loop
      Str := Ada.Text_IO.Unbounded_IO.Get_Line;
      Arr(Counter) := Integer'Value(Ada.Strings.Unbounded.To_String(Str));
      Counter := Counter + 1;
    end loop;

    return Arr(0..Counter-1);
  end get_ints;

end get_stdin;

我正在此过程中使用此程序包进行呼叫:

procedure d1 is
  StdinArr : get_stdin.IntegerArray := get_stdin.get_ints;

begin
   null; -- Array processing to follow
end;

这将成功编译,然后通过管道输入文本文件:

me@mypc /cygdrive/c/Users/me/aoc2018

$ cat d1.txt
-6
-1
-18
-10
...etc

me@mypc /cygdrive/c/Users/me/aoc2018
$ cat d1.txt | ./d1.exe

raised CONSTRAINT_ERROR : bad input for 'Value: "-6"

“-6”是文本文件中的第一个值。我的字符串到整数的转换代码基本上是从this question复制的。

  • 我不确定为什么会引发错误的输入错误。
  • 如果我用文件中的正整数替换-6,则会引发相同的错误
  • 它在Windows 10上的Cygwin下运行。
  • gnatmake版本7.3.0编译/链接

注意:我刚开始使用Ada,所以我的代码总体上可能存在很多问题。

我在做什么错了,我该如何修复此函数/程序包以返回正确填充了IntegerArray的{​​{1}}类型?

1 个答案:

答案 0 :(得分:2)

这是行尾问题。我在Windows 10上的cygwin下运行。我的文本文件具有Windows样式的行尾。

使用dos2unix

$ cat d1.txt | dos2unix.exe | ./d1.exe

足以使其正常工作。

如果任何人都可以准确解释原因,那将很有趣。我猜测Get_Line仅去除\n字符,而不去除\r