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

3 回复

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

你的代码有几个问题导致控制台没有输出。主要问题在于:

  1. 输入处理逻辑错误evenNumbers函数检查的是size切片的长度,而不是检查元素本身是否为偶数
  2. 输入读取不完整:只读取了一行输入,但需要处理多行
  3. 切片传递错误:向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

关键修正点:

  1. 使用strings.Fields()分割输入字符串
  2. 使用strconv.Atoi()将字符串转换为整数
  3. 正确检查数字是否为偶数(num%2 == 0
  4. 完整读取所有需要的输入行
回到顶部