You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言数组输入异常:输入n后a[0]自动赋值0并跳过输入

问题分析与解决办法

这个问题的核心是输入缓冲区残留的换行符导致的:

  • 输入5并按下回车后,fmt.Scanf("%v", &n)只读取了数字5,但回车产生的换行符还留在输入缓冲区里。
  • 接下来循环读取a[0]时,fmt.Scanf("%v", &a[0])会先读取这个换行符,但换行符不是有效的整数,解析失败,所以a[0]保持数组默认的初始值0,程序直接跳到a[1]的输入环节。

解决办法(任选其一即可)

方法1:改用fmt.Scan读取输入

fmt.Scan会自动跳过空白字符(包括换行、空格),能直接避免缓冲区残留问题:

package main

import (
    "fmt"
)

func main() {
    var a = [100]int{}
    var n int
    fmt.Print("N = ")
    fmt.Scan(&n) // 替换为Scan
    for i := 0; i < n; i++ {
        fmt.Printf("a[%v] = ", i)
        fmt.Scan(&a[i]) // 替换为Scan
    }
    for i := 0; i < n; i++ {
        fmt.Printf("%v ", a[i])
    }
    fmt.Println()
}

方法2:读取n后清空缓冲区

如果坚持使用Scanf,可以在读取n之后手动清空缓冲区的残留字符:

package main

import (
    "fmt"
    "bufio"
    "os"
)

func main() {
    var a = [100]int{}
    var n int
    fmt.Print("N = ")
    fmt.Scanf("%v", &n)
    // 读取并丢弃缓冲区中剩余的换行符
    bufio.NewReader(os.Stdin).ReadString('\n')
    for i := 0; i < n; i++ {
        fmt.Printf("a[%v] = ", i)
        fmt.Scanf("%v", &a[i])
    }
    for i := 0; i < n; i++ {
        fmt.Printf("%v ", a[i])
    }
    fmt.Println()
}

方法3:用bufio统一处理输入

这种方式更灵活,能彻底规避输入缓冲区的各类问题:

package main

import (
    "fmt"
    "bufio"
    "os"
    "strconv"
    "strings"
)

func main() {
    var a = [100]int{}
    var n int
    reader := bufio.NewReader(os.Stdin)
    
    fmt.Print("N = ")
    nStr, _ := reader.ReadString('\n')
    nStr = strings.TrimSpace(nStr)
    n, _ = strconv.Atoi(nStr)
    
    for i := 0; i < n; i++ {
        fmt.Printf("a[%v] = ", i)
        numStr, _ := reader.ReadString('\n')
        numStr = strings.TrimSpace(numStr)
        a[i], _ = strconv.Atoi(numStr)
    }
    
    for i := 0; i < n; i++ {
        fmt.Printf("%v ", a[i])
    }
    fmt.Println()
}

内容的提问来源于stack exchange,提问作者Lu cute 3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 07:26:08