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

3 回复

你没有检查错误。

//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$ 
回到顶部