在Golang中冲洗stdin缓冲区?

时间:2018-10-10 00:44:54

标签: go

我是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的新人。

1 个答案:

答案 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文件的行为相同