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
相关产品推荐
相关产品推荐

