我正在参加「掘金·启航计划」。
不知行数,多行,且扫描一行处理一行
fmt.Scan()
从标准输入扫描文本,读取由空白格分割的值,保存并传递给本函数的参数中,换行符也视为空白格。
io.EOF表示输入结束
func main(){
var a,b int
for{
if _,err:=fmt.Scan(&a,&b);err!=io.EOF{
fmt.Println(a+b)
}else {
break
}
}
多行,第一个作为长度,其他座位数组读入
bufio.NewReader(os.Stdin)
func main(){
input:=bufio.NewScanner(os.Stdin)
for input.Scan(){
nums:=strings.Split(input.Text()," ")
res:=0
for i:=1;i<len(nums);i++{
num,_:=strconv.Atoi(nums[i])
res+=num
}
fmt.Println(res)
}
}
Scanner缓冲区扫描数据流时,使用带缓冲区的io,缓冲区大小有限制。此时缓冲区中数据格式为[]byte。bufio.NewScanner是通过io.EOF停止输入,也就是说,此时缓冲区存在多行数据。
使用input.Scan,即读入下一行,并移除行末的换行符。
此时使用Text()将作为包含其字节的字符窜返回,使用Split按照空格分割后转换为string数组,Atoi将字符串转换为整型。
一行字符串操作
func main(){
input:=bufio.NewScanner(os.Stdin)
input.Scan()
input.Scan()
str:=strings.Split(input.Text()," ")
sort.StringSlice.Sort(str)
fmt.Println(strings.Join(str," "))
}
- strings.Split得到的是string数组
⚠️
bufio.NewScanner的缓存区有一定的容量限制,如果超缓冲区,需要扩容
// 扩容
bufio.NewScanner(os.Stdin)
bs := make([]byte, 2000*1024)
input.Buffer(bs, len(bs)) // 设置缓冲区大小
// 默认大小是 MaxScanTokenSize = 64 * 1024