我是Go的新编程人员。 我一直在写这个使用结构的小程序。 这是一个称为用户的结构,它具有值,名字,姓氏和年龄。 问题出在输入数据时,更具体地说,当输入姓氏时,会发生此错误: a screenshot of the error
从图像中可以看到,当您在名称字段中引入数据时, 忽略姓氏字段,并跳至年龄。
具有C语言知识,当未刷新缓冲区时会发生此错误。 (但是C和Go是另一种语言)
据我所知,Go stdin读取是无缓冲的。 那么您将如何解决这个问题?
代码如下:
package main
import "fmt"
type user struct {
name, surnm string
age int
}
func main() {
n := new(user)
fmt.Print("Name? ")
fmt.Scanf("%s", &n.name)
fmt.Print("Last name? ")
fmt.Scanf("%s", &n.surnm)
fmt.Print("Age? ")
fmt.Scanf("%d", &n.age)
fmt.Println(n.name)
fmt.Println(n.surnm)
fmt.Println(n.age)
}
对不起,如果我的问题有点愚蠢,但是我怎么说,我是Go的新人。
答案 0 :(得分:1)
在Ubuntu上的go 1.11上很难重现这一点 我猜您正在使用某种Microsoft操作系统 微软的行尾为\ r \ n,return +换行符,而类似Unix的系统只有\ n换行符
如果我为程序的\ r \ n行尾伪造了一个输入文件 它似乎跳过了
只有\ n的输入文件可使程序正常工作
在所示的模式中添加显式\ r似乎可以解决问题
fmt.Print("Name? ")
fmt.Scanf("%s\r", &n.name)
fmt.Print("Last name? ")
fmt.Scanf("%s\r", &n.surnm)
fmt.Print("Age? ")
fmt.Scanf("%d\r", &n.age)
这很奇怪,go documentation on scanf指出
在所有扫描功能中,立即返回回车 通过换行符被视为普通换行符(\ r \ n的含义与 \ n)。
为了公平起见,一旦进行了以上更改,该代码对于\ n文件和\ r \ n文件的行为相同