我是 golang 的新手,已经从 python 切换了。我正在尝试扫描一个数组并将其显示给用户。但是,如果有任何尾随空格,则 go 不会等待用户输入下一个 int(就像在 c++ 中发生的那样),而是使用零。func main() { var k int fmt.Scanf("%d", &k) for i:= 0 ; i< k ; i++{ arr(5) }}func arr(l int){ arr:= make([]int, l) for i := 0; i < l; i++ { fmt.Scanf("%d",&arr[i]) } fmt.Println(arr)}这是我的代码,所以当我输入1_1_2_3_4_5_ 其中下划线表示将打印出来的黑色空间[0 1 2 3 4]预期的结果是[1 2 3 4 5]我的代码有问题吗?或者这就是 Scanf() 函数的工作方式,如果是这样,我应该使用什么以便它类似于 c++ scanf() 的工作方式?我试图了解为什么我自己会发生这种情况并遇到缓冲区,但我不明白这里的图片是如何出现的。
1 回答
慕娘9325324
TA贡献1783条经验 获得超4个赞
您的输出是忽略返回的错误的结果fmt.Scanf。
使用您显示的第一次调用fmt.Scanfinside的输入arr()将返回: 0和 unexpected newline.
第一个值是成功扫描的项目数。第二个是返回的错误。因为有一个错误,arr[0]没有分配任何东西并保持在默认值0. 由于您忽略了错误,因此程序将继续并从下一行开始arr[1]扫描。1
根据fmt.Scanf文档,错误来自输入中的换行符需要匹配格式字符串中的换行符这一事实。
要正确处理第一行,您应该具有以下内容:
func main() {
var k int
n, err := fmt.Scanf("%d\n", &k)
if err != nil {
panic(err)
}
if n != 1 {
panic("expected one input")
}
for i:= 0 ; i< k ; i++{
arr(5)
}
}
您同样需要处理arr().
两条忠告:
永远不要忽略错误
阅读您使用的功能的文档
- 1 回答
- 0 关注
- 112 浏览
添加回答
举报
0/150
提交
取消