1

以下是“软件工程师的 Ada”示例程序的来源:

http://www.springer.com/cda/content/document/cda_downloaddocument/978-1-84882-313-6_programs.zip

提取后转到 c04-arrays/justify

$ gnatmake justify.adb

运行 justify,并将输出与作为输入的“example.txt”进行比较。我得到的输出是交织在一起的,与理由无关。如果我保存输出:

$ justify > result.txt

然后看着我可以得出结论,有些行写在终端中的其他行之上。但即使我忽略了这个问题,结果也很难被称为正当性。

我的问题:你得到同样的意外输出吗?你得到的输出是否类似于理由?

请注意,输入也与源一起提供!所以我什至不想破坏这个程序。

我在终端上得到的输出:

  敏捷的棕色狐狸跳过了懒惰的狗。
          棕狐跳过了这只懒狗。
          迅捷棕狐跳过了懒狗迅捷棕狐跳了起来
 敏捷的棕色狐狸跳过了懒惰的狗。
  敏捷的棕色狐狸在懒惰的狗身上。
 敏捷的棕色狐狸跳过了狗。
 敏捷的棕狐跳过懒惰的
 你慢吞吞的灰狼跳过了这只活泼的猫。
 慢吞吞的灰狼跳过了活泼的猫。
  缓慢的灰狼狼吞虎咽地咬住了这只活泼的猫。
 慢吞吞的灰太狼猫。
 慢吞吞的灰狼跳过了
 慢条斯理的灰狼跳过了活泼的
          猫。

重定向后的输出:

          敏捷的棕色狐狸跳过了懒惰的狗。
  快的
          棕狐跳过了这只懒狗。
          迅捷棕狐跳过了懒狗迅捷棕狐跳了起来
          敏捷的棕色狐狸跳过了懒惰的狗。
 快的
          棕狐跳过了这只懒狗。
  敏捷的棕色狐狸
          跳过了懒惰的狗。
 敏捷的棕狐跳了过去
          懒惰的狗。
 敏捷的棕狐跳过懒惰的
          狗。
  慢吞吞的灰狼跳过了活泼的猫。
 这
          慢吞吞的灰太狼跳过了这只活泼的猫。
 慢灰色
          狼跳过了活泼的猫。
  缓慢的灰狼
          跳过了活泼的猫。
 慢吞吞的灰狼跳过
          在活泼的猫。
 慢吞吞的灰狼跳过了
          活泼的猫。
 慢条斯理的灰狼跳过了活泼的
          猫。


这应该是正当理由吗?这个问题与我的机器/系统/终端/外壳特别有关,还是其他地方的问题?

4

2 回答 2

3

我在 Mac OS X 上得到相同的输出。

问题是这example.txt是一个带有 CR/LF 行结尾的 Windows 文件,并且您在 Unix 系统上运行,它只需要 LF;并且 Ada RTS 将 CR 留在每个输入行的末尾。(我怀疑 C RTS 可能会做同样的事情;Python 处理得更好)。

Wikipedia中有很多信息,包括您可以cat -v用来查看控制字符的信息:

      The quick brown fox jumped over the  lazy  dog.^M  The  quick
      brown     fox     jumped     over     the     lazy     dog.^M
      ThequickbrownfoxjumpedoverthelazydogThequickbrownfoxjumpedov
      The  quick  brown  fox  jumped over the lazy dog.^M The quick
      brown fox jumped over the lazy dog.^M  The  quick  brown  fox
      jumped  over  the lazy dog.^M The quick brown fox jumped over
      the lazy dog.^M The quick brown  fox  jumped  over  the  lazy
      dog.^M  The  slow gray wolf skipped over the frisky cat.^M The
      slow gray wolf skipped over the frisky cat.^M The  slow  gray
      wolf  skipped  over  the  frisky  cat.^M  The  slow gray wolf
      skipped over the frisky cat.^M The  slow  gray  wolf  skipped
      over  the  frisky  cat.^M The slow gray wolf skipped over the
      frisky cat.^M The slow gray  wolf  skipped  over  the  frisky
      cat.^M ^M 

我不知道您的系统是否有dos2unix实用程序,但无论如何您都可以使用tr

$ tr -d '\r' <example.txt >example.lf
$ mv example.lf example.txt

通常,您可以提取归档文件,以转换原始标识为文本unzip -a的所有文件的行尾;zip在这种情况下,它将所有文件都标识为二进制文件,因此您可以使用它unzip -aa来强制转换(鉴于这些是教科书示例,可以肯定的是,其中不会有任何实际的二进制文件!)

于 2013-02-04T16:28:37.987 回答
0

答案可能是您的控制台使制表符看起来像空格,从而产生不同的外观结果。


您可以使用以下方法进行测试:

Ada.Text_IO.Put( ASCII.HT & '.' );
Ada.Text_IO.Put( ' ' & '.');

看看这两个时期是否在同一列。

于 2013-02-04T14:49:57.373 回答