2017-09-14 17 views
1

作为标题,我很难描述问题。所以我在下面展示了示例代码,输入和输出。Golang:fmt.Printf stdout的挂起发生在for循环中fmt.Scan stdin旁边

package main 

import (
    "fmt" 
) 

func main() { 
    for i := 1; i <= 3; i++ { 
     var a, b, c string 
     fmt.Scan(&a) 
     fmt.Scan(&b) 
     fmt.Scan(&c) 
     fmt.Printf("%s\n", a) 
    } 
} 

输入

a b c 
d e f 
g h i 

期望输出

a 
d 
g 

但是,实际的输出印有 “一”, “d” 之首。然后,按返回(输入)键,打印出“g”。这是实际产出。


更新

如果我粘贴整个九个字符,第三次迭代被挂。然而,如果我只是一个接一个地输入字符,它就会达到预期的输出。

+1

你看到预期的行为......你想要什么,你没有看到? ...除了互动之外,您还可以将输入保存到文件中,然后发出'cat/my/file | myprogram'然后你会看到a,d和g分别在它自己的行上 –

+0

在第三个interation中,它会在扫描到&c时挂起,寻找空白。返回(输入)也被计为空白。 – bigless

回答

2

您是如何在没有回报(输入)的情况下输入该输入的?

如果您以交互方式运行并实际输入所有输入,我认为您会理解输出的原因。

您将有:

  • a b c类型 - 什么都不会输出又作为第三Scan不知道是否c是所有你键入
  • return (enter) - 只有在这个时候,你会看到a输出
  • 执行相同的其他线路

看看该文档为Scan这也解释了这个问题,以及:

https://golang.org/pkg/fmt/#Scan

+0

谢谢。我没有仔细阅读手册。 –