在go中理解fmt包

时间:2014-12-27 10:14:09

标签: loops syntax go stdout stdin

输出中的2来自哪里?

我编写了一个从STDIN读取并将值返回到STDOUT的程序。

package main

import "fmt"

func main() {
    var steps, i, a, b int
    fmt.Scanf("%d", &steps)
    for i = 0; i <= steps; i++ {
        fmt.Scanf("%d", &a)
        fmt.Scanf("%d", &b)
        fmt.Println(a + b)
    }
}

我有一个输入文件

2
2 5
4           8

当我使用go run program.go < input运行程序时,我得到:

2
7
12

而不是:

7
12

为什么?

2 个答案:

答案 0 :(得分:3)

在尝试之后,事实证明(在我的Linux机器上)如果输入文件是&#34; Windows格式&#34;,CRLF行结束,它将给出你的行为。如果输入文件是&#34; Unix格式,LF行结束,它按预期工作。如果在行的末尾添加垃圾,也会得到相同的行为,例如:

2x
2 5x
4           8x

所以它似乎并没有将CR识别为空白字符,这可以被&#34;%d&#34;格式说明符,并在找到它时停止读取,就像上面示例中的x一样。

我认为这应该被称为bug。这当然不方便,因为在Linux上工作时遇到恰好有Windows风格的行结束的文本文件并不常见。

答案 1 :(得分:0)

i <= steps应为i < steps