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

Go语言使用Scanf连续获取用户输入失败问题咨询

问题原因分析

这个问题的核心是输入缓冲区残留的换行符在搞鬼:当你第一次输入2并按下回车时,fmt.Scanf("%s", &inStr)只会读取到非空白的字符串"2",而回车产生的换行符\n会留在标准输入的缓冲区里。当程序执行到第二个fmt.Scanf("%s", &inStr2)时,%s格式符会自动跳过前导空白(包括这个残留的换行符),但如果此时缓冲区里没有其他非空白字符,部分终端环境会直接判定输入结束,导致程序不等你输入就退出了。

解决方案

这里提供几种实用的修复方案,你可以根据需求选择:

方案1:手动清除缓冲区残留的换行符

在第一个Scanf之后,用fmt.Scanln()读取并丢弃缓冲区里剩下的换行符,确保后续输入不受影响:

package main
import "fmt"

func main() {
 var inStr string
 var inStr2 string
 fmt.Printf("Input? ")
 fmt.Scanf("%s", &inStr)
 fmt.Printf("\nOutput: %s\n", inStr)
 // 清除缓冲区里的残留换行符
 fmt.Scanln()
 fmt.Printf("Input2? ")
 fmt.Scanf("%s", &inStr2)
 fmt.Printf("\nOutput: %s\n", inStr2)
}

方案2:改用bufio.NewReader读取整行

如果需要读取包含空格的完整输入行,或者想彻底规避缓冲区问题,推荐使用bufio包的方法,它能精准读取每一行输入:

package main
import (
 "bufio"
 "fmt"
 "os"
 "strings"
)

func main() {
 reader := bufio.NewReader(os.Stdin)
 
 fmt.Printf("Input? ")
 inStr, _ := reader.ReadString('\n')
 // 去掉末尾的换行符和多余空格
 inStr = strings.TrimSpace(inStr)
 fmt.Printf("\nOutput: %s\n", inStr)
 
 fmt.Printf("Input2? ")
 inStr2, _ := reader.ReadString('\n')
 inStr2 = strings.TrimSpace(inStr2)
 fmt.Printf("\nOutput: %s\n", inStr2)
}

方案3:用fmt.Scanln简化输入(适合无空格的场景)

fmt.Scanln会在读取到换行符时停止,并且自动丢弃换行符,操作更简洁。不过要注意:它会以空白字符作为字段分隔符,输入包含空格时只会读取第一个空格前的内容:

package main
import "fmt"

func main() {
 var inStr string
 var inStr2 string
 fmt.Printf("Input? ")
 fmt.Scanln(&inStr)
 fmt.Printf("\nOutput: %s\n", inStr)
 
 fmt.Printf("Input2? ")
 fmt.Scanln(&inStr2)
 fmt.Printf("\nOutput: %s\n", inStr2)
}

内容的提问来源于stack exchange,提问作者Shanks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:30:20