Golang中如何获取输入大小和输入元素并打印到控制台?
Golang中如何获取输入大小和输入元素并打印到控制台?
package main
/*
输入大小:2 和 6
输入元素:32 91 和 22 90 45 43 2 57
预期输出:32 和 22 90 2
实际输出:控制台为空
*/
import (
"bufio"
"fmt"
"os"
)
func evenNumbers(size []int) []int {
var input []int
for _, v := range size {
if len(size)%2 == 0 {
input = append(input, v)
}
}
return input
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
var slice []int
num := evenNumbers(slice)
for _, result := range num {
fmt.Print(result)
}
}
更多关于Golang中如何获取输入大小和输入元素并打印到控制台?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
Rifki_Rahmattullah:
if len(size)%2 == 0 {
你这里每次得到的结果都一样。我想你的意思是 if v % 2 == 0 …
更多关于Golang中如何获取输入大小和输入元素并打印到控制台?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
bufio.Scanner.Scan 的文档说明:
Scan 方法将 Scanner 推进到下一个令牌,然后可以通过 Bytes 或 Text 方法获取该令牌。
因此,你必须先调用 Scan 来将第一个令牌加载到扫描器的缓冲区中,然后调用 (*bufio.Scanner).Bytes 来获取实际的值。你可能需要将 Scan 的调用放在一个循环中,以便持续读取令牌,将它们解析为整数(也许可以使用 strconv.Atoi),然后将它们追加到一个 []int 切片中。
根据 bufio.NewScanner 的文档,默认情况下,令牌是按行分隔的。如果你想读取同一行上的单词,例如 32 91,那么你可能需要使用 (*bufio.Scanner).Split 来更改扫描器的 bufio.SplitFunc,并传入 bufio.ScanWords。
你的代码有几个问题导致控制台没有输出。主要问题在于:
- 输入处理逻辑错误:
evenNumbers函数检查的是size切片的长度,而不是检查元素本身是否为偶数 - 输入读取不完整:只读取了一行输入,但需要处理多行
- 切片传递错误:向
evenNumbers传递了一个空切片
以下是修正后的代码:
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func filterEvenNumbers(numbers []int) []int {
var evens []int
for _, num := range numbers {
if num%2 == 0 {
evens = append(evens, num)
}
}
return evens
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
// 读取第一行:大小
fmt.Print("输入大小: ")
scanner.Scan()
sizeInput := scanner.Text()
sizeStrs := strings.Fields(sizeInput)
// 解析大小
var sizes []int
for _, s := range sizeStrs {
num, _ := strconv.Atoi(s)
sizes = append(sizes, num)
}
// 处理每个数组
for i, size := range sizes {
fmt.Printf("输入第%d个数组的%d个元素: ", i+1, size)
scanner.Scan()
elementsInput := scanner.Text()
elementStrs := strings.Fields(elementsInput)
// 解析元素
var numbers []int
for j := 0; j < size && j < len(elementStrs); j++ {
num, _ := strconv.Atoi(elementStrs[j])
numbers = append(numbers, num)
}
// 过滤偶数并输出
evens := filterEvenNumbers(numbers)
fmt.Printf("偶数元素: ")
for _, even := range evens {
fmt.Printf("%d ", even)
}
fmt.Println()
}
}
或者,如果你想要一个更接近你原始需求的简化版本:
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// 读取大小
fmt.Print("输入大小: ")
scanner.Scan()
sizeStrs := strings.Fields(scanner.Text())
// 处理每个数组
for _, sizeStr := range sizeStrs {
size, _ := strconv.Atoi(sizeStr)
// 读取元素
fmt.Printf("输入%d个元素: ", size)
scanner.Scan()
elementStrs := strings.Fields(scanner.Text())
// 输出偶数
fmt.Print("偶数: ")
for i := 0; i < size && i < len(elementStrs); i++ {
num, _ := strconv.Atoi(elementStrs[i])
if num%2 == 0 {
fmt.Printf("%d ", num)
}
}
fmt.Println()
}
}
示例运行:
输入大小: 2 6
输入2个元素: 32 91
偶数: 32
输入6个元素: 22 90 45 43 2 57
偶数: 22 90 2
关键修正点:
- 使用
strings.Fields()分割输入字符串 - 使用
strconv.Atoi()将字符串转换为整数 - 正确检查数字是否为偶数(
num%2 == 0) - 完整读取所有需要的输入行

