【问题标题】:Understanding the fmt package in go理解 go 中的 fmt 包
【发布时间】:2014-12-27 20:00:48
【问题描述】:

输出中的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 &lt; input 运行程序时,我得到:

2
7
12

代替:

7
12

为什么?

【问题讨论】:

  • 如果我用&lt;= 修复错误,我会得到预期的输出。
  • 你能粘贴你的代码吗?修复后i &lt; steps 我得到2 7 但没有12
  • 嗯,它只是你的代码和输入文件的副本。
  • 我注意到这个格式更明确的代码可以正常工作,但我无法解释为什么你的代码不能按预期工作,所以我不会回答:play.golang.org/p/BGEa9zns3Y

标签: loops syntax go stdout stdin


【解决方案1】:

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

2x
2 5x
4           8x

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

我认为这应该被称为错误。这当然很不方便,因为在 Linux 上工作时遇到碰巧有 Windows 样式行结尾的文本文件并不少见。

【讨论】:

  • 你是对的,输入格式错误(不是仅\n)。
  • 也许打开一个问题?我不认为这是记录在案或故意的github.com/golang/go/issues
  • 实际上,“在所有扫描函数中,回车后紧跟换行符的行被视为普通换行符(\r\n 与 \n 含义相同)。”在 fmt 文档中强烈暗示否则
  • 虽然这是 Go 中的一个错误,但我接受这个答案,因为您发现了问题所在。谢谢。
  • 我不是语言律师,但你不应该在scanf格式字符串中给出\n吗?如果您提供\n,那么正如包装文档所述,您提供\r\n\n 并不重要,例如:play.golang.org/p/NlBL8itLaq。 Doc 说:Scanf、Fscanf 和 Sscanf 要求输入中的换行符以匹配格式中的换行符;其他例程将换行符视为空格。
【解决方案2】:

i &lt;= steps 应该是i &lt; steps

【讨论】:

  • 谢谢,但是前导2仍然出现问题
猜你喜欢
  • 2014-06-29
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 2021-10-08
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多