Golang中fmt.Scanln在用户输入包含空格时出现故障
Golang中fmt.Scanln在用户输入包含空格时出现故障 大家好,我是第一次来这里,也是Go语言的新手(目前正在学习)。
我遇到一个简单的问题。我的代码会要求输入姓名、年龄,然后运行一个循环。当我输入像 John Doe 这样的名字时(即:包含空格的名字),程序就会出现故障,并跳过年龄输入。我尝试通过在 fmt.Scanln() 中添加 \n 来解决,但依然没有帮助。为什么会这样呢?
package main
import "fmt"
func main() {
var (
age int
name string
)
fmt.Println("Hello there!")
fmt.Println("Welcome to Universe DB!\n")
fmt.Printf("Please input your name: ")
fmt.Scanln("%s\n", &name)
fmt.Println("Your name is:", name)
fmt.Printf("\nPlease input your age: ")
fmt.Scanln("%v\n", &age)
for i := 0; i < age; i++ {
fmt.Println("For the", i+1, "time, your name is:", name)
}
fmt.Println()
i := 0
for i < age {
if i > 0 {
break
}
fmt.Printf("Complementary print #%d\n", i+1)
i++
}
numbers := [5]int{1, 2, 3, 4, 5}
for i, num := range numbers {
fmt.Printf("Range print #%d: %d\n", i+1, num)
}
for i, num := range [5]int{32, 54, 343, 2} {
fmt.Printf("Range print (type 2) #%d: %d\n", i+1, num)
}
for i, num := range make([]int, 3) {
fmt.Printf("Range print (type 3) #%d: %d\n", i+1, num)
}
fmt.Println()
}
更多关于Golang中fmt.Scanln在用户输入包含空格时出现故障的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你没有检查错误。
//fmt.Scanln("%s\n", &name)
n, err := fmt.Scanln("%s", &name)
if err != nil {
fmt.Println(n, err)
}
Please input your name: 0 type not a pointer: string
你没有查阅文档:package fmt。
func Scanln(a ...interface{}) (n int, err error)
它没有格式字符串。
它不是
func Scanf(format string, a ...interface{}) (n int, err error)
应该写成:
n, err := fmt.Scanln(&name)
if err != nil {
fmt.Println(n, err)
return
}
fmt.Println("Your name is:", name)
更多关于Golang中fmt.Scanln在用户输入包含空格时出现故障的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
问题出在 fmt.Scanln 的使用方式上。fmt.Scanln 的格式字符串参数与 fmt.Scanf 不同,它不支持格式化占位符。当使用 fmt.Scanln("%s\n", &name) 时,它会尝试匹配字面字符串 "%s\n",而不是读取输入到变量中。
对于包含空格的输入,应该使用 bufio 包来读取整行输入。以下是修改后的代码示例:
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Println("Hello there!")
fmt.Println("Welcome to Universe DB!\n")
fmt.Printf("Please input your name: ")
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
fmt.Println("Your name is:", name)
fmt.Printf("\nPlease input your age: ")
ageStr, _ := reader.ReadString('\n')
ageStr = strings.TrimSpace(ageStr)
age, _ := strconv.Atoi(ageStr)
for i := 0; i < age; i++ {
fmt.Println("For the", i+1, "time, your name is:", name)
}
fmt.Println()
i := 0
for i < age {
if i > 0 {
break
}
fmt.Printf("Complementary print #%d\n", i+1)
i++
}
numbers := [5]int{1, 2, 3, 4, 5}
for i, num := range numbers {
fmt.Printf("Range print #%d: %d\n", i+1, num)
}
for i, num := range [5]int{32, 54, 343, 2} {
fmt.Printf("Range print (type 2) #%d: %d\n", i+1, num)
}
for i, num := range make([]int, 3) {
fmt.Printf("Range print (type 3) #%d: %d\n", i+1, num)
}
fmt.Println()
}
如果坚持使用 fmt.Scanln,可以这样修改(但只能读取到第一个空格):
fmt.Printf("Please input your name: ")
fmt.Scanln(&name) // 移除格式字符串
对于包含空格的输入,第一个示例使用 bufio.Reader 是最可靠的解决方案。
感谢您的反馈,但我仍然遇到相同的问题。
package main
import "fmt"
func main() {
var (
age int
name string
)
fmt.Println("Hello there!")
fmt.Println("Welcome to Universe DB!\n")
fmt.Printf("Please input your name: ")
n, err := fmt.Scanln(&name)
if err != nil {
fmt.Println(n, err)
}
fmt.Println("Your name is:", name)
fmt.Printf("\nPlease input your age: ")
n, err = fmt.Scanln(&age)
if err != nil {
fmt.Println(n, err)
}
for i := 0; i < age; i++ {
fmt.Println("For the", i+1, "time, your name is:", name)
}
fmt.Println()
i := 0
for i < age {
if i > 0 {
break
}
fmt.Printf("Complementary print #%d\n", i+1)
i++
}
numbers := [5]int{1, 2, 3, 4, 5}
for i, num := range numbers {
fmt.Printf("Range print #%d: %d\n", i+1, num)
}
for i, num := range [5]int{32, 54, 343, 2} {
fmt.Printf("Range print (type 2) #%d: %d\n", i+1, num)
}
for i, num := range make([]int, 3) {
fmt.Printf("Range print (type 3) #%d: %d\n", i+1, num)
}
fmt.Println()
}
程序输出:
Hello there!
Welcome to Universe DB!
Please input your name: Aceis Asm
1 expected newline
Your name is: Aceis
Please input your age: 0 expected integer
Range print #1: 1
Range print #2: 2
Range print #3: 3
Range print #4: 4
Range print #5: 5
Range print (type 2) #1: 32
Range print (type 2) #2: 54
Range print (type 2) #3: 343
Range print (type 2) #4: 2
Range print (type 2) #5: 0
Range print (type 3) #1: 0
Range print (type 3) #2: 0
Range print (type 3) #3: 0
node09@node09:~/proj/learn/hello-go$ m
m: command not found
node09@node09:~/proj/learn/hello-go$

