看一看Scanf
docs
Scanf扫描从标准输入读取的文本,将连续的空格分隔值存储到格式确定的连续参数中.它返回成功扫描的项目数.如果该数目少于参数数量,则Err将报告原因.输入中的换行符必须与格式中的换行符匹配.唯一的例外是:动词%c总是扫描输入中的下一个符文,即使它是空格(或制表符等)或换行符.
与您的问题最相关的两点是:
- 空格分隔值
- 输入中的换行符必须与格式中的换行符匹配
因此,如果您按原样运行您的应用程序,然后输入20 foo
并按Enter键,您将得到预期的输出(foo
打印20次).但是,如果您输入20
,然后按Enter键,您将看到20个空行;要了解为什么要运行:
var n int
var s string
fmt.Scanf("%d", &n)
_, err := fmt.Scanf("%s", &s)
if err != nil {
panic(err)
}
这将在panic: unexpected newline
出现异常,因为根据规范,"输入中的换行符必须与格式中的换行符匹配".假设您希望在每次输入后按Enter键,则可以使用fmt.Scanf("%d\n", &n)
.然而,正如您在注释中提到的,如果您使用fmt.Scanf("%s\n", &s)
并输入一个包含空格的字符串,那么您将只得到第一位(因为scanf
使用空格作为分隔符).
如果你想从stdin
得到一整行,那么this question的答案提供了一些选项,例如
func main() {
var n int
var s string
fmt.Println("How many times? ")
fmt.Scanf("%d\n", &n)
fmt.Println("What to output? ")
reader := bufio.NewReader(os.Stdin)
s, _ = reader.ReadString('\n')
for i := 0; i < n; i++ {
fmt.Printf("%s", s)
}
}