Go语言中打印用户输入字符串n次却输出空白的问题解决
解决Go语言输入整数后字符串读取为空的问题
问题出在fmt.Scanf("%d", &n)的行为上:它只会读取输入中的数字部分,输入时按下的回车键(换行符\n)会残留在标准输入缓冲区中。后续的fmt.Scanf("%s", &s)会自动跳过开头的空白字符(包括这个残留的换行符),如果此时没有输入新的字符串内容,s就会被赋值为空字符串,导致循环打印空白。
以下是几种修复方案:
方案一:使用fmt.Scanln读取输入
fmt.Scanln会在读取内容后自动丢弃换行符,避免残留问题:
package main import ( "fmt" ) func main() { var n int var s string fmt.Scanln(&n) fmt.Scanln(&s) for i := 0; i < n; i++ { fmt.Printf("%s\n", s) } }
方案二:手动丢弃缓冲区的换行符
在读取整数后,额外读取并丢弃残留的换行符:
package main import ( "fmt" ) func main() { var n int var s string fmt.Scanf("%d", &n) fmt.Scanf("\n") // 清除缓冲区中的换行符 fmt.Scanf("%s", &s) for i := 0; i < n; i++ { fmt.Printf("%s\n", s) } }
方案三:用bufio.Reader处理输入(推荐)
这种方式更灵活,支持读取包含空格的字符串,同时能精准处理输入的换行符:
package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func main() { reader := bufio.NewReader(os.Stdin) // 读取并转换整数 nInput, _ := reader.ReadString('\n') n, _ := strconv.Atoi(strings.TrimSpace(nInput)) // 读取字符串并去除首尾空白和换行符 s, _ := reader.ReadString('\n') s = strings.TrimSpace(s) for i := 0; i < n; i++ { fmt.Printf("%s\n", s) } }
注意:如果需要读取包含空格的字符串,fmt.Scanf("%s")无法满足需求,因为它会在遇到第一个空格时停止读取,此时推荐使用bufio.Reader的方案。
内容的提问来源于stack exchange,提问作者Maz Diaz
相关产品推荐
相关产品推荐

