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

