3.5 KiB
3.5 KiB
Go 语言 ACM 格式输入输出教程
基础输入函数
使用 fmt.Scan 系列函数(不使用 bufio 缓冲区):
| 函数 | 说明 |
|---|---|
fmt.Scan(&a) |
读取一个值,以空格/换行分隔 |
fmt.Scanf("%d", &a) |
带格式说明符读取 |
fmt.Scanln(&a) |
读取一行,以换行结束 |
fmt.Sscan(str, &a) |
从字符串读取 |
示例 1:单行读取两个整数
输入:
3 5
代码:
package main
import "fmt"
func main() {
var a, b int
fmt.Scan(&a, &b)
fmt.Println(a + b)
}
示例 2:先给 n,再读 n 个数
输入:
5
1 2 3 4 5
代码:
package main
import "fmt"
func main() {
var n int
fmt.Scan(&n)
arr := make([]int, n)
for i := 0; i < n; i++ {
fmt.Scan(&arr[i])
}
// 计算总和
sum := 0
for _, v := range arr {
sum += v
}
fmt.Println(sum)
}
示例 3:多行输入,每行两个数
输入:
1 2
3 4
5 6
代码:
package main
import (
"fmt"
"io"
)
func main() {
var a, b int
for {
_, err := fmt.Scan(&a, &b)
if err == io.EOF {
break
}
fmt.Println(a + b)
}
}
示例 4:多组测试数据(EOF 结束)
输入:
3
1 2 3
2
4 5
代码:
package main
import (
"fmt"
"io"
)
func main() {
for {
var n int
_, err := fmt.Scan(&n)
if err == io.EOF {
break
}
sum := 0
for i := 0; i < n; i++ {
var x int
fmt.Scan(&x)
sum += x
}
fmt.Println(sum)
}
}
示例 5:读取字符串
输入:
hello world
代码:
package main
import "fmt"
func main() {
var s string
fmt.Scan(&s) // 只读到空格前
fmt.Println(s) // 输出: hello
// 读取整行
fmt.Scanln() // 清除换行符
var line string
fmt.Scanln(&line)
fmt.Println(line) // 输出: world
}
示例 6:特定结束符(输入 0 结束)
输入:
1
2
3
0
代码:
package main
import "fmt"
func main() {
for {
var n int
fmt.Scan(&n)
if n == 0 {
break
}
fmt.Println(n * 2)
}
}
示例 7:读取不定长行(空格分隔)
输入:
1 2 3 4 5
代码:
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
line := scanner.Text()
parts := strings.Fields(line)
for _, s := range parts {
n, _ := strconv.Atoi(s)
fmt.Print(n, " ")
}
fmt.Println()
}
常用输出格式
// 换行输出
fmt.Println(a, b)
// 空格分隔不换行
fmt.Print(a, " ", b)
// 格式化输出
fmt.Printf("%d %d\n", a, b)
// 拼接字符串输出
fmt.Println(strings.Join(strs, " "))
练习模板
package main
import (
"fmt"
"io"
)
func main() {
// 在这里写你的代码
var n int
if _, err := fmt.Scan(&n); err == io.EOF {
return
}
// 处理逻辑
fmt.Println(n)
}
注意事项
- 输入输出效率:纯
fmt.Scan对于大量数据(>10^5)会较慢 - 换行符处理:
fmt.Scan会自动跳过空格和换行 - EOF 检测:用
io.EOF判断输入结束 - 类型匹配:确保变量类型与输入格式匹配