输出中的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
为什么?
答案 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
。