了解 go 中的 fmt 包

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

为什么 ?


HUX布斯
浏览 151回答 2
2回答

守着星空守着你

尝试过之后,结果证明(在我的 Linux 机器上)如果输入文件是“Windows 格式”,并且以 CRLF 行结束,它会给出你的行为。如果输入文件是“Unix 格式,以 LF 行结束,它会按预期工作。如果在行尾添加垃圾,您也会得到相同的行为,例如像这样:2x2 5x4&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;8x所以它似乎没有将 CR 识别为空白字符,可以通过“%d”格式说明符跳过它,并在找到它时停止读取,就像我上面例子中的 x 一样。我认为这应该称为错误。这当然很不方便,因为在 Linux 上工作时遇到碰巧具有 Windows 风格行尾的文本文件并不少见。

慕运维8079593

i <= steps应该是i < steps。
打开App,查看更多内容
随时随地看视频慕课网APP