
本文介绍使用 Go 语言高效读取两行标准输入、解析空格分隔的整数字符串,并分别存入两个独立的 []int 切片的完整实现,涵盖扫描、分割、转换与错误处理。
本文介绍使用 go 语言高效读取两行标准输入、解析空格分隔的整数字符串,并分别存入两个独立的 `[]int` 切片的完整实现,涵盖扫描、分割、转换与错误处理。
在 Go 中,从 stdin 读取结构化输入(如每行多个空格分隔的整数)需结合 bufio.Scanner(按行读取)与 strings.Fields(智能分割空白字符)及 strconv.Atoi(安全转整型)。以下是一个健壮、可复用的解决方案:
首先,定义一个通用解析函数 numbers(s string) []int:它将一行字符串按空白符切分为字段,逐个尝试转为 int;转换失败时直接忽略(也可根据需求改为返回错误)。该函数利用 strings.Fields 自动处理连续空格、首尾空格等边界情况,比 strings.Split(s, " ") 更可靠。
func numbers(s string) []int {
var n []int
for _, field := range strings.Fields(s) {
if i, err := strconv.Atoi(field); err == nil {
n = append(n, i)
}
}
return n
}
主逻辑中,使用 for 循环配合计数器(i )精确读取前两行,避免无限等待或意外多读。通过 switch 分支将第一行结果赋给 firstLine,第二行赋给 secondLine:
func main() {
var firstLine, secondLine []int
scanner := bufio.NewScanner(os.Stdin)
for i := 1; i <p><strong>注意事项:</strong> </p>
- 若输入不足两行(如仅一行或空输入),程序会自然退出循环,
secondLine保持为nil切片(即[]int(nil)),符合 Go 惯例;如需严格校验,可在循环后检查scanner.Err()或行数计数。 -
strconv.Atoi在转换失败时返回非nil错误,当前实现选择静默跳过非法字段(如"abc"或"12a");若需强校验,建议改用panic或返回([]int, error)并统一处理。 - 对于超大输入或性能敏感场景,可预估切片容量(如
make([]int, 0, 16))减少内存重分配。
此方案简洁、安全、符合 Go 的惯用风格,适用于算法题、脚本工具等典型 stdin 解析场景。










