
本文介绍了如何使用 fmt.Scanln() 函数从标准输入读取一行包含多个整数的数据,并将这些整数存储到切片中。文章详细讲解了标准库函数 fmt.Scan() 的用法,并提供了一个简洁高效的示例代码,帮助读者理解如何在 Go 语言中正确处理标准输入。
在 Go 语言中,从标准输入读取数据并将其存储到切片中是一个常见的需求。fmt.Scanln() 函数似乎是一个直接的选择,但它并不能直接将输入读取到整数切片中。 这是因为 fmt.Scanln() 的参数需要是 interface{} 类型,而直接传递 []int 会导致类型不匹配的错误。
为了实现这个目标,我们需要使用 fmt.Scan() 函数,并在循环中逐个读取整数并将其添加到切片中。以下是一个示例代码:
package mainimport ( "fmt" "strconv" "strings")func readIntSlice() ([]int, error) { var input string _, err := fmt.Scanln(&input) if err != nil { return nil, err } // 使用 strings.Split 分割字符串 strSlice := strings.Split(input, " ") intSlice := make([]int, len(strSlice)) for i, strVal := range strSlice { intVal, err := strconv.Atoi(strVal) if err != nil { return nil, fmt.Errorf("invalid input: %s", strVal) } intSlice[i] = intVal } return intSlice, nil}func main() { fmt.Println("Please enter a line of integers separated by spaces:") nums, err := readIntSlice() if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Read integers: %vn", nums)}
或者,使用 fmt.Scan 逐个读取:
package mainimport ( "fmt")func readInts(n int) ([]int, error) { in := make([]int, n) for i := range in { _, err := fmt.Scan(&in[i]) if err != nil { return in[:i], err // 返回已读取的部分和错误 } } return in, nil}func main() { fmt.Println("Please enter", n, "integers separated by spaces:") n := 3 // 假设要读取 3 个整数 nums, err := readInts(n) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Read integers: %vn", nums)}
代码解释:
readInts(n int) ([]int, error) 函数:
接受一个整数 n 作为参数,表示要读取的整数数量。创建一个长度为 n 的整数切片 in。使用 for 循环遍历切片 in 的索引。在循环中使用 fmt.Scan(&in[i]) 读取一个整数并将其存储到 in[i] 中。如果读取过程中发生错误(例如,用户输入了非整数),则返回已读取的部分切片和错误信息。如果成功读取了所有 n 个整数,则返回完整的切片和 nil 错误。
main() 函数:
提示用户输入 n 个以空格分隔的整数。调用 readInts(n) 函数读取整数切片。检查是否发生错误。如果发生错误,则打印错误信息并退出。如果成功读取了整数切片,则打印切片的内容。
注意事项:
fmt.Scan() 会跳过空格和换行符。如果用户输入的整数数量少于 n,fmt.Scan() 会等待更多输入,直到读取到 n 个整数或遇到错误。如果用户输入的整数数量多于 n,多余的输入会被忽略。fmt.Scan() 在遇到错误时会停止读取,并返回错误信息。
总结:
虽然 fmt.Scanln() 不能直接读取到整数切片,但我们可以使用 fmt.Scan() 函数,并在循环中逐个读取整数并将其添加到切片中。这种方法更加灵活,并且可以处理各种输入情况。通过理解 fmt.Scan() 的工作原理和错误处理,我们可以编写出健壮且可靠的 Go 程序来处理标准输入。另一种方法是先读取一行字符串,然后使用 strings.Split 分割字符串,最后使用 strconv.Atoi 将字符串转换为整数。选择哪种方法取决于具体的需求和个人偏好。
以上就是使用 fmt.Scanln() 读取整数切片的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1410642.html
微信扫一扫
支付宝扫一扫